{
  "generatedAt": "2026-09-06T00:58:38.690Z",
  "counts": {
    "compatibility-migration": 2200,
    "legacy-identifier": 4786,
    "legal-attribution": 163,
    "source-history-internal-note": 2596
  },
  "total": 9745,
  "violations": 0,
  "rows": [
    {
      "path": ".claude/launch.json",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "\"name\": \"texise-dev\","
    },
    {
      "path": ".claude/launch.json",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"TEXISE_DEV_PORT\": \"5225\""
    },
    {
      "path": ".claude/launch.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "\"name\": \"texise-preview-production\","
    },
    {
      "path": ".claude/launch.json",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"TEXISE_PREVIEW_PORT\": \"4963\""
    },
    {
      "path": ".claude/skills/texise-desktop-release/SKILL.md",
      "line": 2,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "name: texise-desktop-release"
    },
    {
      "path": ".claude/skills/texise-desktop-release/SKILL.md",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "description: Build, test, package, and release the TeXise Electron desktop app. Use when working on desktop nightlies, stable desktop releases, Electron smoke tests, updater artifacts, or macOS signing/notarization."
    },
    {
      "path": ".claude/skills/texise-desktop-release/SKILL.md",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# TeXise Desktop Release"
    },
    {
      "path": ".claude/skills/texise-desktop-release/agents/openai.yaml",
      "line": 2,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "display_name: \"TeXise Desktop Release\""
    },
    {
      "path": ".claude/skills/texise-desktop-release/agents/openai.yaml",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "default_prompt: \"Use $texise-desktop-release for TeXise Electron desktop release and smoke-test work.\""
    },
    {
      "path": ".claude/skills/texise-followup-operator/SKILL.md",
      "line": 2,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "name: texise-followup-operator"
    },
    {
      "path": ".claude/skills/texise-followup-operator/SKILL.md",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "description: Operate recurring TeXise agent follow-ups after a thread has already started. Use when the user asks to continue, check status, decide what is next, push, create or update a PR, poll CI, rebase, merge, release, run Playwright/manual UX checks, spawn or aggregate code-review subagents, run thermonuclear review, address review findings, make a plan, add a project task, or asks \"we good?\", \"pushed?\", \"PR?\", \"did you test?\", \"what should I test?\", or similar follow-up prompts in the TeX"
    },
    {
      "path": ".claude/skills/texise-followup-operator/SKILL.md",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# TeXise Follow-up Operator"
    },
    {
      "path": ".claude/skills/texise-followup-operator/SKILL.md",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Use this skill to convert short TeXise follow-ups into the next concrete action. Keep repository-wide engineering policy in `AGENTS.md`/`CLAUDE.md`; keep plan-specific policy in `plans/AGENTS.md`."
    },
    {
      "path": ".claude/skills/texise-followup-operator/SKILL.md",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- For releases, use the applicable TeXise release skill and `AGENTS.md` release gates."
    },
    {
      "path": ".claude/skills/texise-followup-operator/SKILL.md",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- For adding, updating, triaging, scheduling, or reconciling TeXise project items, use the TeXise project-operator workflow when available."
    },
    {
      "path": ".claude/skills/texise-followup-operator/agents/openai.yaml",
      "line": 2,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "display_name: \"TeXise Follow-up Operator\""
    },
    {
      "path": ".claude/skills/texise-followup-operator/agents/openai.yaml",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "short_description: \"Handle recurring TeXise thread follow-ups\""
    },
    {
      "path": ".claude/skills/texise-followup-operator/agents/openai.yaml",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "default_prompt: \"Use $texise-followup-operator to continue this TeXise agent thread with the right review, test, PR, or release workflow.\""
    },
    {
      "path": ".codex/skills/texise-desktop-release/SKILL.md",
      "line": 2,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "name: texise-desktop-release"
    },
    {
      "path": ".codex/skills/texise-desktop-release/SKILL.md",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "description: Build, test, package, and release the TeXise Electron desktop app. Use when working on desktop nightlies, stable desktop releases, Electron smoke tests, updater artifacts, or macOS signing/notarization."
    },
    {
      "path": ".codex/skills/texise-desktop-release/SKILL.md",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# TeXise Desktop Release"
    },
    {
      "path": ".codex/skills/texise-desktop-release/agents/openai.yaml",
      "line": 2,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "display_name: \"TeXise Desktop Release\""
    },
    {
      "path": ".codex/skills/texise-desktop-release/agents/openai.yaml",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "default_prompt: \"Use $texise-desktop-release for TeXise Electron desktop release and smoke-test work.\""
    },
    {
      "path": ".codex/skills/texise-followup-operator/SKILL.md",
      "line": 2,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "name: texise-followup-operator"
    },
    {
      "path": ".codex/skills/texise-followup-operator/SKILL.md",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "description: Operate recurring TeXise agent follow-ups after a thread has already started. Use when the user asks to continue, check status, decide what is next, push, create or update a PR, poll CI, rebase, merge, release, run Playwright/manual UX checks, spawn or aggregate code-review subagents, run thermonuclear review, address review findings, make a plan, add a project task, or asks \"we good?\", \"pushed?\", \"PR?\", \"did you test?\", \"what should I test?\", or similar follow-up prompts in the TeX"
    },
    {
      "path": ".codex/skills/texise-followup-operator/SKILL.md",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# TeXise Follow-up Operator"
    },
    {
      "path": ".codex/skills/texise-followup-operator/SKILL.md",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Use this skill to convert short TeXise follow-ups into the next concrete action. Keep repository-wide engineering policy in `AGENTS.md`/`CLAUDE.md`; keep plan-specific policy in `plans/AGENTS.md`."
    },
    {
      "path": ".codex/skills/texise-followup-operator/SKILL.md",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- For releases, use the applicable TeXise release skill and `AGENTS.md` release gates."
    },
    {
      "path": ".codex/skills/texise-followup-operator/SKILL.md",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- For adding, updating, triaging, scheduling, or reconciling TeXise project items, use the TeXise project-operator workflow when available."
    },
    {
      "path": ".codex/skills/texise-followup-operator/agents/openai.yaml",
      "line": 2,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "display_name: \"TeXise Follow-up Operator\""
    },
    {
      "path": ".codex/skills/texise-followup-operator/agents/openai.yaml",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "short_description: \"Handle recurring TeXise thread follow-ups\""
    },
    {
      "path": ".codex/skills/texise-followup-operator/agents/openai.yaml",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "default_prompt: \"Use $texise-followup-operator to continue this TeXise agent thread with the right review, test, PR, or release workflow.\""
    },
    {
      "path": ".github/scripts/update-cloudflare-preview-comment.cjs",
      "line": 1,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const marker = '<!-- texise-cloudflare-pr-preview -->';"
    },
    {
      "path": ".github/workflows/desktop-release.yml",
      "line": 82,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_RELEASE_VERSION: ${{ steps.metadata.outputs.version }}"
    },
    {
      "path": ".github/workflows/desktop-release.yml",
      "line": 113,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_RELEASE_VERSION: ${{ needs.preflight.outputs.version }}"
    },
    {
      "path": ".github/workflows/desktop-release.yml",
      "line": 118,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_RELEASE_VERSION: ${{ needs.preflight.outputs.version }}"
    },
    {
      "path": ".github/workflows/desktop-release.yml",
      "line": 123,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_RELEASE_VERSION: ${{ needs.preflight.outputs.version }}"
    },
    {
      "path": ".github/workflows/desktop-release.yml",
      "line": 143,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "name: texise-desktop-${{ needs.preflight.outputs.channel }}-${{ needs.preflight.outputs.version }}"
    },
    {
      "path": ".github/workflows/e2e-shard.yml",
      "line": 42,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_E2E_SHARD: ${{ inputs.shard }}/2"
    },
    {
      "path": ".github/workflows/node.js.yml",
      "line": 14,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "group: texise-${{ github.event.pull_request.number || github.ref }}"
    },
    {
      "path": ".github/workflows/texise-release-quality.yml",
      "line": 1,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "name: TeXise Release Quality"
    },
    {
      "path": ".github/workflows/texise-release-quality.yml",
      "line": 30,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "name: texise-release-quality-report"
    },
    {
      "path": "AGENTS.md",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "TeXise is a local-first scientific writing and LaTeX application. Projects are"
    },
    {
      "path": "AGENTS.md",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "editing built on CodeMirror/ProseMirror and TeXise services. Workspaces can use"
    },
    {
      "path": "AGENTS.md",
      "line": 83,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "rules are the `texiseWorkspaceConfig.allowedWorkspaces` fields in each"
    },
    {
      "path": "AGENTS.md",
      "line": 101,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "Package metadata also declares `texisePackageConfig.env` (`browser`, `nodejs`,"
    },
    {
      "path": "AGENTS.md",
      "line": 112,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "- `packages/core/editor`: TeXise editor service, save lifecycle, and"
    },
    {
      "path": "AGENTS.md",
      "line": 277,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "accepted tradeoff. Use `TEXISE_PORT_SEED=<name>` when a worktree needs to share"
    },
    {
      "path": "AGENTS.md",
      "line": 282,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_DEV_PORT` for `pnpm start`."
    },
    {
      "path": "AGENTS.md",
      "line": 283,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_PREVIEW_PORT` for `pnpm preview-production`."
    },
    {
      "path": "AGENTS.md",
      "line": 284,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_STORYBOOK_PORT` for `pnpm storybook`."
    },
    {
      "path": "AGENTS.md",
      "line": 285,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_E2E_PORT` for the app server launched by `pnpm e2e:ci`."
    },
    {
      "path": "AGENTS.md",
      "line": 286,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_E2E_CT_PORT` for the Playwright component-test server."
    },
    {
      "path": "AGENTS.md",
      "line": 295,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`TEXISE_DEV_PORT=5317 pnpm start`."
    },
    {
      "path": "AGENTS.md",
      "line": 317,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "`https://www.texise.com`; use the checked-in TeXise installer/deploy scripts"
    },
    {
      "path": "AGENTS.md",
      "line": 327,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "against `https://www.texise.com/`, inspect browser console errors, and confirm"
    },
    {
      "path": "AGENTS.md",
      "line": 331,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "## Autonomous TeXise Execution and Context Handoff"
    },
    {
      "path": "AGENTS.md",
      "line": 333,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "- For multi-phase TeXise implementation work, continue autonomously through all remaining safe phases using **Execute → Verify → Identify/Fix → Verify → Continue**. Do not pause for routine confirmation."
    },
    {
      "path": "CHANGELOG.md",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Modernizes the capability/release audits so they certify the current Learnitive architecture instead of retired TeXise service paths or the discarded Markdown-specific Terminal/Track/Review/AI Review proposal."
    },
    {
      "path": "CHANGELOG.md",
      "line": 59,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- Verification in the implementation environment: **345/345** supported server/static tests, **10/10** project-runtime tests, dedicated vibe-coding invariants **6/6** (included in the 345), capability audit **30/30**, frozen pnpm lock sync, trusted runtime manifest, R12 release audit, Learnitive brand audit, TeXise provenance audit, installer syntax, server/gateway syntax, and TypeScript syntax parsing for all 14 modified TS/TSX files all pass."
    },
    {
      "path": "CHANGELOG.md",
      "line": 90,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Seeds a small set of recent TeXise changes on first migration; administrators remain authoritative and can edit or remove them."
    },
    {
      "path": "CHANGELOG.md",
      "line": 94,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Comparison polish reuses the homepage FAQ component, removes row-level `Source:` clutter, gives TeXise positive checks a yellow circular treatment, shows the Free project allowance as `5`, removes the workflow-priority table and shortens comparison headings/copy."
    },
    {
      "path": "CHANGELOG.md",
      "line": 96,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Comparison follow-up removes the duplicated “Choose TeXise/competitor” recommendation cards, removes guide Evidence/How-to-choose cards, uses normal supporting labels instead of eyebrow styling inside workflow-fit cards, and fixes the `/compare/*` back-link/category-label overlap at the shared layout level."
    },
    {
      "path": "CHANGELOG.md",
      "line": 105,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- TeXise servers still do not install, run or proxy Ollama; the browser connects directly to the user's Ollama service."
    },
    {
      "path": "CHANGELOG.md",
      "line": 107,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# TeXise R14.28.20 Build Fix 51.2 — Texposit-style User-side Ollama Workflow"
    },
    {
      "path": "CHANGELOG.md",
      "line": 109,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Mirrors the Texposit Ollama experience in TeXise: Ollama is installed and run only on the user's computer, the AI Assistant automatically detects `localhost:11434`, offers **Use Local Ollama**, discovers installed models, exposes a model dropdown, and uses the selected local model across supported TeXise AI workflows."
    },
    {
      "path": "CHANGELOG.md",
      "line": 110,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- If the local Ollama service stops or becomes unreachable, TeXise automatically falls back to the last configured browser-held BYOK AI provider when one exists. Privacy Mode deliberately disables that cloud fallback and remains fail-closed."
    },
    {
      "path": "CHANGELOG.md",
      "line": 115,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# TeXise R14.28.20 Build Fix 51.1 — Production Privacy, AI, PDF & Search Hardening"
    },
    {
      "path": "CHANGELOG.md",
      "line": 138,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Routes Ollama through the existing TeXise AI Suggest, configured AI, Review and Paper Memory-compatible workflows while keeping source changes review-mediated and cloud credentials browser-held only for BYOK AI providers."
    },
    {
      "path": "CHANGELOG.md",
      "line": 139,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds `/docs/ollama` plus updated AI Overview, Paper Memory, Automatic AI and plan documentation explaining browser Local AI vs Ollama vs BYOK AI and the required `OLLAMA_ORIGINS=https://www.texise.com` setup."
    },
    {
      "path": "CHANGELOG.md",
      "line": 148,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Rebuilds the public homepage into the concise Hero → product visual → differentiators → Power Features → TeXise vs Overleaf → Pricing → FAQ → final CTA journey while preserving the BF49 interactive workspace preview and editor recovery."
    },
    {
      "path": "CHANGELOG.md",
      "line": 153,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Adds a distinct optional `TEXISE_PRO_MONTHLY_SHOP` checkout configuration so monthly Pro can never be confused with the existing Lifetime Deal path."
    },
    {
      "path": "CHANGELOG.md",
      "line": 158,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added an explicit Automatic AI `..?` cue: when the watcher is enabled and ready in safe prose, TeXise consumes the cue and immediately reviews the preceding sentence while keeping the normal idle-trigger workflow intact."
    },
    {
      "path": "CHANGELOG.md",
      "line": 162,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Repaired the native LaTeX Visual round-trip contract so TeXise-generated literal escapes (`\\%`, `\\_`, `\\#`, `\\&`, `\\$`, braces, `\\textbackslash{}`, `\\textasciitilde{}`, `\\textasciicircum{}`) reparse as editable prose instead of Protected LaTeX, including recovered trailing paragraphs."
    },
    {
      "path": "CHANGELOG.md",
      "line": 169,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Template catalog cards now use an A4 portrait thumbnail surface and fall back to the supplied TeXise `texise-template-default-thumbnail.webp` only when no custom thumbnail is configured; Template Preview/PDF remains a separate feature."
    },
    {
      "path": "CHANGELOG.md",
      "line": 171,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Made every Visual-mode construct that TeXise cannot safely edit a deliberate Source-navigation surface: protected block boxes and inline pills are keyboard/click accessible, show an Open in Source affordance, and select the exact canonical source range when opened."
    },
    {
      "path": "CHANGELOG.md",
      "line": 192,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Fixed `/templates` returning `Template manifest request failed (403)` after Admin template mutations: runtime Assets Sync now explicitly keeps `dist/texise-templates/` at `0755` and generated catalog JSON at `0644`, overriding the trusted API service's intentional `UMask=0027`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 224,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Seeds 28 clearly labelled TeXise-created demonstration templates across 10 academic institutions, bringing the working catalog to 36 published templates while explicitly stating that no institutional endorsement is implied."
    },
    {
      "path": "CHANGELOG.md",
      "line": 237,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Updates the homepage hero to `TeXise — Privacy First Research` / `Writing Platform` and changes capability labels to exactly `Research`, `Code`, and `Document`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 238,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds the new responsive `Built for Real Workflows` section immediately after Built Awesome with four TeXise-native placeholder stories and local placeholder artwork ready for final user-supplied copy/images."
    },
    {
      "path": "CHANGELOG.md",
      "line": 254,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Preserves the filesystem-first template architecture under `texise-templates/free/` and `texise-templates/pro/` while adding a complete Admin template CMS: safe single/bulk ZIP import, rich metadata editing, institution management, Free/Pro moves, structural validation and first-class Assets Sync."
    },
    {
      "path": "CHANGELOG.md",
      "line": 258,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Sets the homepage H1/title to `TeXise — Local-First Overleaf Alternative LaTeX Research Editor with CLI`, removes the stale multi-competitor homepage matrix and strengthens research-workflow positioning."
    },
    {
      "path": "CHANGELOG.md",
      "line": 260,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Enriches truthful template `CreativeWork` structured data, blog/article semantics, organization/social identity and page-specific OG behavior while keeping the supplied 1200×630 TeXise image as the generic fallback."
    },
    {
      "path": "CHANGELOG.md",
      "line": 261,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- Continues the TeXise branding cleanup with TeXise Editor/TeXise Terminal product naming while retaining only genuine dependency, compiler, migration, legal/provenance and social-handle references."
    },
    {
      "path": "CHANGELOG.md",
      "line": 266,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# R14.28.20 Build Fix 40 — Hotfix9 SEO & TeXise Core Branding — 2026-08-23"
    },
    {
      "path": "CHANGELOG.md",
      "line": 269,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Uses the TeXise 1200×630 social image for generic public pages and the actual CMS blog cover image for article Open Graph/Twitter metadata, preserving real media dimensions when known."
    },
    {
      "path": "CHANGELOG.md",
      "line": 272,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Migrates TeXise-owned workspace/package/config/protocol/editor identifiers away from inherited project branding, including `@learnitive/*`, `@learnitive/prosemirror-editor`, `texise://app/`, TeXise desktop/mobile identity and `texise-db`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 282,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Removes the `texise-why-card-visual` mini-workspace strip from every feature card and drops the now-unused visual-rendering code."
    },
    {
      "path": "CHANGELOG.md",
      "line": 284,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Changes `.texise-why-card-pin` to `background: #f5f3ed`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 286,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "- Preserves Hotfix 6 and Hotfix 5 hero behavior: Source/Visual reveal, simulated Compile and Terminal, wider rounded PDF, editor-column Terminal, body-font `@TeXiser`, exact 4% yellow hero gradient, configured Pro CTA, and mobile toolbar scrolling."
    },
    {
      "path": "CHANGELOG.md",
      "line": 291,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds a `Why TeXise? / Built Different` section directly below the homepage hero using large TeXise-yellow feature cards with white mini-workspace visuals."
    },
    {
      "path": "CHANGELOG.md",
      "line": 292,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Shows only `Privacy First`, `Local Compilation`, and `Live Collaboration` initially; an accessible Show more/Show less caret reveals or hides nine additional TeXise capability cards."
    },
    {
      "path": "CHANGELOG.md",
      "line": 293,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Keeps the section entirely TeXise-specific and dependency-light: no external reference images, no Prefix/Pixi/Thetapad branding, and no new runtime service initialization."
    },
    {
      "path": "CHANGELOG.md",
      "line": 300,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Reverts the floating `@TeXiser` X CTA from Moranga to the normal TeXise body font."
    },
    {
      "path": "CHANGELOG.md",
      "line": 301,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Changes `.texise-home-hero-v2` to the exact requested 4% yellow top gradient."
    },
    {
      "path": "CHANGELOG.md",
      "line": 302,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Adds `Open Workspace` (`/projects`) and an outlined `Buy Pro $29` CTA directly beneath the hero title. The Pro link is sourced from the public `shopUrl` backed by `TEXISE_SHOP`; while runtime config is still loading/unconfigured, the visual CTA stays disabled instead of linking to the wrong destination."
    },
    {
      "path": "CHANGELOG.md",
      "line": 310,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "- Preserves the BF39.2 auto reveal, fake compile/PDF refresh, simulated Terminal, mobile toolbar scrolling, Moranga `@TeXiser`, and glow-free hero."
    },
    {
      "path": "CHANGELOG.md",
      "line": 316,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Replaces the homepage mock's binary Source/Visual swap with a layered Source↔Visual comparison: Visual stays mounted underneath, Source is clipped above it, and a TeXise-yellow draggable divider starts around 64% Source and automatically oscillates between roughly 22% and 78%."
    },
    {
      "path": "CHANGELOG.md",
      "line": 319,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Makes the real mobile `.texise-editor-toolbar` horizontally scrollable with native momentum scrolling, no wrapping and non-shrinking toolbar controls while leaving desktop layout unchanged."
    },
    {
      "path": "CHANGELOG.md",
      "line": 320,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Changes the floating `@TeXiser` X CTA to the TeXise Moranga display font while preserving `https://x.com/texiser` and BF38 analytics behavior."
    },
    {
      "path": "CHANGELOG.md",
      "line": 321,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Removes the `texise-home-hero-glow` decorative background entirely; the hero retains only its subtle grid, formulas and existing yellow accents."
    },
    {
      "path": "CHANGELOG.md",
      "line": 327,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Enlarges the TeXise workspace simulation to a taller ~520–560px desktop session with 29 realistic LaTeX source lines, an expanded manuscript/PDF preview and current TeXise Source/Visual/Navigator/TexLab/AI Review/Review/Tools vocabulary."
    },
    {
      "path": "CHANGELOG.md",
      "line": 329,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Highlights the Terminal control with TeXise yellow and a one-time invitation glow; clicking it opens a simulated dark local Terminal showing scientific Python output. Clicking Terminal again or the close control dismisses it."
    },
    {
      "path": "CHANGELOG.md",
      "line": 338,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds a fail-closed BF39 regression/source contract for the valid `role=\"group\"` + `aria-label=\"TeXise capabilities\"` combination. Focused BF39 regression is now **10/10 PASS**."
    },
    {
      "path": "CHANGELOG.md",
      "line": 341,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Rebuilt the public homepage first screen around an original TeXise composition: the exact two-line `Your Research. Your Device. / Your Privacy.` headline, a detailed static TeXise editor wireframe as the central visual, one concise local-first description, and three circular-check capabilities (`Research`, `Run Codes`, `Document in TeX`)."
    },
    {
      "path": "CHANGELOG.md",
      "line": 342,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- The wireframe reflects current TeXise concepts (project files, Source/Visual/Navigator, Compile, PDF, Terminal, TexLab, AI and Review) while remaining lightweight presentation-only markup; it does not initialize CodeMirror, PDF.js, BusyTeX, MathLive, project services, AI workers or terminal runtimes."
    },
    {
      "path": "CHANGELOG.md",
      "line": 343,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added full-first-screen sizing, subtle TeXise-yellow grid/formula ambience, responsive desktop/tablet/mobile wireframe reductions, dark-theme compatibility through existing tokens and reduced-motion handling."
    },
    {
      "path": "CHANGELOG.md",
      "line": 345,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "- Capitalized the floating X handle to `@TeXiser` while preserving `https://x.com/texiser` and BF38 analytics/cookie behavior."
    },
    {
      "path": "CHANGELOG.md",
      "line": 350,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Replaced production favicon/PWA artwork with the supplied TeXise favicon suite while preserving TeXise manifest identity."
    },
    {
      "path": "CHANGELOG.md",
      "line": 351,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added Facebook/X footer links and a public floating `@texiser` X CTA."
    },
    {
      "path": "CHANGELOG.md",
      "line": 354,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Provisioned optional `TEXISE_GOOGLE_TAG_ID` through `/etc/texise/texise.env`; Google Tag loads only after Accept cookies."
    },
    {
      "path": "CHANGELOG.md",
      "line": 361,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- The deployment wrapper exports the preserved root-owned `/etc/texise/texise.env` only into the collaboration live-health subprocess so `SESSION_SECRET` is available to the local signer without appearing on the command line or weakening public relay admission. Guests in the health test remain unsigned, exactly like normal shared-link joiners."
    },
    {
      "path": "CHANGELOG.md",
      "line": 412,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Removes the universal `admin/admin` bootstrap credential. Fresh installations do not create an administrator automatically; operators provision or reset `admin@texise.com` explicitly with `sudo texise-saas admin-create`, with the password read from an interactive PTY with terminal echo explicitly disabled rather than from argv or environment files."
    },
    {
      "path": "CHANGELOG.md",
      "line": 424,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Protects locally divergent same-room work before rematerialisation. Extra files/directories and same-path files changed since the last collaboration snapshot are copied into `.texise-local-recovery/<timestamp>/...` before the authoritative shared snapshot is applied; per-room snapshot baselines and stale collaboration IndexedDB state are garbage-collected."
    },
    {
      "path": "CHANGELOG.md",
      "line": 428,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Tightens the production CSP from arbitrary `wss:` destinations to the canonical TeXise WebSocket origin while retaining required HTTPS provider connectivity."
    },
    {
      "path": "CHANGELOG.md",
      "line": 430,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds BF33 source/release contracts for admin provisioning/revocation, persistent throttling, relay admission/targeted transfer, duplicate-client rejection, Host refresh, Stop drain, sealed structure, persistence GC, canonical-source reads, local divergence recovery, CSP and dependency security floors. Browser contracts additionally cover Host refresh/reclaim and same-path `.texise-local-recovery` recovery while preserving the exact named-cursor and formal 10,000-edit soak scenarios."
    },
    {
      "path": "CHANGELOG.md",
      "line": 436,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Retains the already-proven upstream Yjs primitives from BF31—`y-websocket`, `y-indexeddb`, `Y.Doc`, per-file `Y.UndoManager` and `y-codemirror.next`—but removes the competing TeXise Source cursor/selection, authorship, Follow/Open, review-CRDT and Visual collaboration machinery from the live editing path."
    },
    {
      "path": "CHANGELOG.md",
      "line": 437,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds a TeXlyre-0.10.16-derived CodeMirror binding: `CodeMirror ↔ y-codemirror.next ↔ Y.Text`. Remote selections, carets, names and colors are rendered by Yjs Awareness/y-codemirror rather than a second TeXise cursor coordinate system."
    },
    {
      "path": "CHANGELOG.md",
      "line": 468,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds BF31 fail-closed source/install/deploy guards, TX6 relay-health markers, TX6 compatibility tests, Collaboration V2 release contracts, and advances the PWA shell to `texise-app-shell-r14-28-14-buildfix31-v1`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 474,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Converts `.texise-project-join-progress` from a generic `div` carrying an unsupported `aria-label` into a semantic `role=\"progressbar\"` with an accessible name plus `aria-valuemin=0`, `aria-valuemax=100`, and dynamic `aria-valuenow`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 477,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advances the PWA shell to `texise-app-shell-r14-28-14-buildfix30-v1`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 485,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advances the PWA shell to `texise-app-shell-r14-28-14-buildfix29-v1`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 497,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advances the PWA shell to `texise-app-shell-r14-28-14-buildfix28-v1` and adds a fail-closed BF28 source guard that validates the explicit installer/deployment source root, preventing a stale overlay from passing by validating the guard script's own directory."
    },
    {
      "path": "CHANGELOG.md",
      "line": 503,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Moves joining to `/projects`: **Join Project** appears immediately before **New Project** and opens a standard one-field TeXise modal with Collaboration token, Cancel and Join actions."
    },
    {
      "path": "CHANGELOG.md",
      "line": 504,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Adds a verified `joinNewProject()` transaction: TeXise synchronizes with the relay, verifies a live compatible Host and `projectReady`, then (and only then) creates or reuses a browser-local project. Invalid/expired/legacy tokens leave no orphan workspace."
    },
    {
      "path": "CHANGELOG.md",
      "line": 507,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Successful joins navigate through TeXise's in-app navigation service so the verified upstream `WebsocketProvider` remains alive. Optional account project-name metadata registration runs after navigation and cannot delay/break collaboration."
    },
    {
      "path": "CHANGELOG.md",
      "line": 510,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advances the PWA application shell to `texise-app-shell-r14-28-14-buildfix27-v1` and adds a fail-closed BF27 source guard."
    },
    {
      "path": "CHANGELOG.md",
      "line": 515,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Keeps `LEGACY_MIGRATION_KEY` as an internal browser-only one-time marker for importing the pre-BF25 TeXise collaboration snapshot into `y-indexeddb`; it is not a licence key, collaboration secret, password, or server credential."
    },
    {
      "path": "CHANGELOG.md",
      "line": 518,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advances the PWA application shell to `texise-app-shell-r14-28-14-buildfix26-v1` while preserving the BF25 upstream `y-websocket`, host-verification, `y-indexeddb`, authorship, admin-Pro, and TikZ fixes."
    },
    {
      "path": "CHANGELOG.md",
      "line": 522,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Replaces BF17-BF24's handwritten browser WebSocket/Yjs transport with the upstream `y-websocket` `WebsocketProvider` architecture used by Texlyre. TeXise retains same-origin room derivation and lifecycle/status projection, while upstream code owns Sync Step 1/2, incremental updates, awareness and reconnect behavior."
    },
    {
      "path": "CHANGELOG.md",
      "line": 525,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Replaces the manual whole-Y.Doc IndexedDB snapshot store with `y-indexeddb` `IndexeddbPersistence`, while migrating the previous `texise-collaboration-v1` snapshot once where available."
    },
    {
      "path": "CHANGELOG.md",
      "line": 527,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Extends `/collab-live` to the standard `y-websocket` room URL form `/collab-live/<room>` while retaining the bounded in-memory TeXise relay, same-origin checks, participant/frame limits, heartbeat and room expiry."
    },
    {
      "path": "CHANGELOG.md",
      "line": 532,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds `y-websocket 3.0.0` and `y-indexeddb 9.0.12` to the frozen workspace dependency graph, advances the PWA cache to `texise-app-shell-r14-28-14-buildfix25-v1`, and adds a BF25 installer source guard that fails closed on partial/stale overlays."
    },
    {
      "path": "CHANGELOG.md",
      "line": 540,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advances the PWA application-shell cache to `texise-app-shell-r14-28-14-buildfix24-v1`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 548,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advances the PWA application-shell cache to `texise-app-shell-r14-28-14-buildfix23-v1` and adds BF23 regression/release contracts for the source guard."
    },
    {
      "path": "CHANGELOG.md",
      "line": 554,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advances the PWA application-shell cache to `texise-app-shell-r14-28-14-buildfix22-v1` so browsers cannot retain the install-blocked BF21 collaboration bundle."
    },
    {
      "path": "CHANGELOG.md",
      "line": 559,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Replaces BF17's custom `/collab-live` snapshot/update protocol with the standard Yjs state-vector sync protocol (Sync Step 1/2 plus incremental updates and awareness), keeping the TeXise same-origin relay while removing the stale-client full-snapshot replacement race."
    },
    {
      "path": "CHANGELOG.md",
      "line": 561,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- Reworks collaborator-authored highlighting into Yjs relative-position provenance stored outside `.tex`, migrates legacy BF16/BF17 `texiseAuthor` formatting, and keeps Source/Visual hover attribution plus review-completion cleanup without modifying manuscript characters."
    },
    {
      "path": "CHANGELOG.md",
      "line": 564,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Gives active `admin` role accounts effective Pro access across the shared entitlement service, all client Pro capability gates, Pro templates, Cloud Compile, Linux Terminal, cloud AI and AI Review. The bootstrap `admin@texise.com` account therefore needs no Payhip licence for testing."
    },
    {
      "path": "CHANGELOG.md",
      "line": 566,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advances the PWA application-shell cache to `texise-app-shell-r14-28-14-buildfix21-v1`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 568,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# R14.28.14 Build Fix 20 — wide TikZ workspace and TeXise tool palette — 2026-08-21"
    },
    {
      "path": "CHANGELOG.md",
      "line": 572,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Restyles TikZ Draw's black tool tiles into TeXise controls: inactive tools/buttons are white with black icons, the active tool and primary action use TeXise yellow (`#DA0B4E`) with black icons/text, hover uses a pale yellow surface, and the Objects header/selection styling is normalized to the surrounding TeXise UI."
    },
    {
      "path": "CHANGELOG.md",
      "line": 573,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advances the PWA application-shell cache to `texise-app-shell-r14-28-14-buildfix20-v1` so an installed older shell cannot retain the narrow TikZ UI after deployment."
    },
    {
      "path": "CHANGELOG.md",
      "line": 593,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- Replaces the first TeXise TikZ node builder with the user-supplied MIT-licensed TikZ Draw editor, vendored same-origin under `/tikz-draw/` and presented in a wide 97vw × 92dvh TeXise-themed modal. The upstream drawing toolset remains available while generated TikZ and embedded images return through a constrained same-origin bridge; TeXise imports images into the browser-local project, provisions required packages/libraries and inserts canonical LaTeX through `latexSource.applyEdits(..., 'visua"
    },
    {
      "path": "CHANGELOG.md",
      "line": 594,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Replaces production WebRTC-only manuscript synchronization with the TeXise-owned `/collab-live` WebSocket relay. The relay carries opaque Yjs document updates/snapshots and awareness in bounded transient memory, provides an explicit initial synchronization handshake and reconnect path, and leaves `/collab-signal` compatibility-only for older clients."
    },
    {
      "path": "CHANGELOG.md",
      "line": 599,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advances the PWA application-shell cache to `texise-app-shell-r14-28-14-buildfix17-v1` so the new collaboration/TikZ browser code cannot be masked by a previously installed BF16 shell."
    },
    {
      "path": "CHANGELOG.md",
      "line": 604,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Registers the service worker with the current `APP_BUILD_TIME` query and advances the app-shell cache generation to `texise-app-shell-r14-28-14-buildfix16-v1`, preventing an older cached shell from surviving a successful deployment and preserving stale `/ws` behavior."
    },
    {
      "path": "CHANGELOG.md",
      "line": 622,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds a public `/learn` training area with 12 original TeXise LaTeX guides, individual crawlable guide routes, public search/navigation/footer integration, sitemap coverage and browser-local completion progress that does not require an account."
    },
    {
      "path": "CHANGELOG.md",
      "line": 625,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Completes a product/architecture audit and records prioritized follow-up items in `docs/TEXISE_FULL_PRODUCT_AUDIT_R14_28_14_BF14.md`. Large public/editor bundle separation remains a deliberate follow-up rather than a risky late change to the just-stabilized `/ws` bootstrap path."
    },
    {
      "path": "CHANGELOG.md",
      "line": 637,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Fixes production Linux Terminal certification where the locally built `texlive/texlive-console:pro` image contained and build-verified NumPy/SciPy/pandas/Matplotlib/SymPy under `/opt/texise-venv`, but interactive sessions still executed the base `/usr/bin/python3` and raised `ModuleNotFoundError: No module named 'numpy'`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 638,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Root cause: Console Gateway starts sessions through `/bin/bash -lc`; the login shell reconstructs `PATH` from `/etc/profile`, overriding the Dockerfile `ENV PATH=/opt/texise-venv/bin:${PATH}` before the interactive shell is exec'd."
    },
    {
      "path": "CHANGELOG.md",
      "line": 639,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- The console image now installs `/etc/profile.d/texise-venv.sh`, and the gateway independently re-asserts `VIRTUAL_ENV=/opt/texise-venv` plus the venv-first PATH both before and inside its generated `.bashrc`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 645,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- `texlive/texlive-console:pro` is now explicitly a TeXise-local image tag. The installer builds it from the checked-in `deploy/docker/console/` context instead of trying to pull a nonexistent Docker Hub repository."
    },
    {
      "path": "CHANGELOG.md",
      "line": 647,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Image schema label `r14.28.14-bf11` prevents needless rebuilds while forcing regeneration when the TeXise image recipe changes."
    },
    {
      "path": "CHANGELOG.md",
      "line": 648,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Operator-supplied non-default `TEXISE_CONSOLE_IMAGE` values remain external images and may still be preloaded or pulled from authenticated registries."
    },
    {
      "path": "CHANGELOG.md",
      "line": 653,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Cloud Compile now uses `texlive/texlive:latest` exclusively through `TEXISE_CLOUD_COMPILE_IMAGE` / `COMPILE_DOCKER_IMAGE`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 654,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Linux Terminal · Pro now uses `texlive/texlive-console:pro` exclusively through `TEXISE_CONSOLE_IMAGE`; the retired shared `TEXISE_EXECUTION_IMAGE` key is removed during upgrade migration."
    },
    {
      "path": "CHANGELOG.md",
      "line": 656,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Docker entrypoints are explicit (`latexmk`/`synctex` for Cloud Compile and `/bin/bash` for Linux Terminal) so image ENTRYPOINT metadata cannot change TeXise execution semantics."
    },
    {
      "path": "CHANGELOG.md",
      "line": 662,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Root cause: the installer enabled the new canonical `texise.com.conf` but did not disable Certbot's historical `texise.com-le-ssl.conf`. That legacy vhost still claimed `www.texise.com` and served `/var/www/texise.com/public_html/` instead of `/dist`; with no public source-root index it could win name-based vhost selection and return 403."
    },
    {
      "path": "CHANGELOG.md",
      "line": 663,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- The installer now disables the conflicting legacy primary Certbot vhost while preserving its file and certificate for rollback, alongside the already-retired legacy `app.texise.com` application-serving vhosts."
    },
    {
      "path": "CHANGELOG.md",
      "line": 664,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Frontend health failures now emit `apache2ctl -S` and the enabled TeXise site symlinks so future vhost-selection conflicts are explicit in deployment logs."
    },
    {
      "path": "CHANGELOG.md",
      "line": 670,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Linux Terminal core production certification no longer rolls back TeXise solely because the operator-managed shared image is missing optional scientific Python modules. NumPy/SciPy/pandas/Matplotlib/SymPy are reported separately and can be made a strict gate with `TEXISE_CONSOLE_REQUIRE_SCIENTIFIC_STACK=1`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 684,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Replaces dynamic ESM namespace import of `node_modules/ws/index.js` with `createRequire()` scoped to `texise-services/console-gateway/package.json`, so the certification script receives the actual CommonJS WebSocket constructor."
    },
    {
      "path": "CHANGELOG.md",
      "line": 685,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Keeps Build Fix 5 script-location independence: dependency resolution is still rooted at `public_html/texise-services/console-gateway` regardless of the operator shell current working directory."
    },
    {
      "path": "CHANGELOG.md",
      "line": 691,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Fixes Linux Terminal Pro production certification resolving `texise-services/console-gateway/node_modules/ws/index.js` relative to the operator shell current working directory. Launching the installer from `/var/www/texise.com` incorrectly produced `/var/www/texise.com/texise-services/...` instead of the canonical `/var/www/texise.com/public_html/texise-services/...`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 693,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds R14.28.14 regression coverage that requires script-relative resolution and forbids the prior cwd-relative `path.resolve('texise-services/...')` form."
    },
    {
      "path": "CHANGELOG.md",
      "line": 694,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- The OVH log confirms the trusted API (`127.0.0.1:3100`) and private Cloud Compile worker (`127.0.0.1:3001`) were both healthy before this Console certification path error; the historical `app.texise.com` vhost does not proxy port 3100 and was not the cause."
    },
    {
      "path": "CHANGELOG.md",
      "line": 698,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Fixes the production Cloud Compile startup failure where `texise-latex-compile.service` could race `npm ci` under `Restart=always`, temporarily producing `ERR_MODULE_NOT_FOUND: express`. Existing execution services are now quiesced before their locked dependency trees are replaced."
    },
    {
      "path": "CHANGELOG.md",
      "line": 699,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Fixes `EACCES` for `/var/www/texise.com/public_html/texise-data/tmp/cloud-compile/jobs`: execution-service users now receive execute-only traversal through `texise-data`/`tmp` while their private Cloud Compile and Console workspaces remain individually owned and non-listable."
    },
    {
      "path": "CHANGELOG.md",
      "line": 715,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Fixes the production Biome `lint/a11y/useAriaPropsSupportedByRole` failure by giving the TeXise workspace overview mock an explicit `role=\"img\"` for its descriptive `aria-label`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 728,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Makes `https://www.texise.com` the canonical single origin and `/var/www/texise.com/public_html` the canonical application root, with direct HTTP/bare-domain redirects and redirect-only `app.texise.com` compatibility vhosts."
    },
    {
      "path": "CHANGELOG.md",
      "line": 729,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Migrates the trusted API/systemd/installer paths to the canonical tree while preserving `/var/www/app.texise.com/public_html` and legacy service trees as rollback material; active TeXise runtime defaults no longer use `/var/lib/texise*`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 730,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Integrates the supplied `texise-latex-compile` worker as **Cloud Compile · Pro** behind the trusted `/api/compile/cloud` broker with server-authoritative Pro entitlement, quotas, bounded input/output/time/concurrency, cancellation and manuscript-safe audit data."
    },
    {
      "path": "CHANGELOG.md",
      "line": 733,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Rebuilds Home from the supplied TeXise reference with the complete research-workflow story, Templates, terminal/local-first sections, comparison matrix, AI/research sections, dual compile messaging, two-plan teaser, FAQ and `/projects` CTAs."
    },
    {
      "path": "CHANGELOG.md",
      "line": 734,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Rebuilds Pricing using only TeXise Free + Lifetime Deal (Includes Pro), preserving the configured shop/price source and adding a grouped feature matrix including Cloud Compile."
    },
    {
      "path": "CHANGELOG.md",
      "line": 737,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Normalizes active PWA/mobile/package/SEO/OAuth/server URLs to `www.texise.com`, bumps the app-shell cache to R14.28.14, and adds R14.28.14 hostname/Home/Pricing/Docs/Cloud regression coverage."
    },
    {
      "path": "CHANGELOG.md",
      "line": 742,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Moves active TeXise runtime state, compiler/cache/temp/log data and AI Review audit state under `public_html/texise-data`, while keeping protected configuration/signing material under `/etc/texise`. Historical `/var/lib/texise*` paths remain only as explicit upgrade-migration inputs."
    },
    {
      "path": "CHANGELOG.md",
      "line": 743,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Moves public Blog cover media to `public_html/texise-media/blog`, serves it directly at `/texise-media/blog/*`, denies `/texise-data/*` in Apache, and prevents SPA fallback from masking missing media."
    },
    {
      "path": "CHANGELOG.md",
      "line": 745,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds upgrade-safe migration for historical Blog media and old `/blog-media/*` CMS URLs, plus deployment write/read/served-byte health checks using the actual TeXise service user."
    },
    {
      "path": "CHANGELOG.md",
      "line": 747,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Rebuilds `/blog/:slug` as a wide TeXise article card with a ~2.2:1 cover, TeXise-owned cover notch, Moranga title, Inter body, JetBrains Mono code, date/tags/author metadata and responsive prose/media/table styling while keeping `/blog` listing cards distinct."
    },
    {
      "path": "CHANGELOG.md",
      "line": 759,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Standardizes the TeXise lockup on Moranga with the exact `Tex·ise` regular-italic wordmark, preloads all eight external production fonts, and gates first render behind a bounded font-readiness check."
    },
    {
      "path": "CHANGELOG.md",
      "line": 760,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Rebuilds the Home hero from the supplied Prefix layout reference using TeXise-owned copy/capability cards, removes Docs from the top navigation while preserving it in the footer/search, and keeps Start Writing pointed at `/projects`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 761,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Simplifies `/projects` to New Project + a single overflow menu for Templates, Link Folder, Import ZIP and Import from GitHub; `/projects` now shares the public Home footer, and per-project actions use TeXise page modals rather than browser-native dialogs."
    },
    {
      "path": "CHANGELOG.md",
      "line": 763,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds Prefix-derived Blog index/article/admin presentation, Toast UI authoring with usage statistics disabled, persistent validated cover media under `/var/www/app.texise.com/public_html/texise-media/blog`, and bounded/sanitized inline `data:image/png;base64,...` article images."
    },
    {
      "path": "CHANGELOG.md",
      "line": 764,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Product-wide native-dialog audit is clean for TeXise UI: no user-facing `alert()`, `confirm()` or `prompt()` remains; the PWA install API's `installPrompt.prompt()` is unrelated and retained."
    },
    {
      "path": "CHANGELOG.md",
      "line": 770,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Moves physical template assets to `/texise-templates/*`, redirects `/examples` to `/templates`, and adds upgrade cleanup/health guards so legacy `templates/` directories cannot recreate the Apache 403 collision."
    },
    {
      "path": "CHANGELOG.md",
      "line": 783,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Moved writable AI Review audit state to `/var/lib/texise` with upgrade-safe migration from the historical `/etc/texise` default."
    },
    {
      "path": "CHANGELOG.md",
      "line": 784,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Preserved strict `/etc/texise` ownership and permissions instead of making configuration writable to the service."
    },
    {
      "path": "CHANGELOG.md",
      "line": 788,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds the optional MySQL account/CMS/support layer, Google OAuth, cloud project metadata registry, persistent account licensing/quota, filesystem-driven templates, public/CMS/admin routes, Prefix-derived TeXise design system and `/ws` visual-identity pass while preserving browser-local project files and compilation."
    },
    {
      "path": "CHANGELOG.md",
      "line": 789,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- Adds upgrade-safe migrations/installer behavior, security hardening, template/contact/auth/license tests and authoritative validation documentation in `docs/TEXISE_SAAS_*`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 795,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Separates R4 from R5: BusyTeX LuaLaTeX is certified once with a tiny TeXise-owned directlua/MEMFS/PDF document, while production Live PDF compiles the canonical project root directly without instrumentation wrappers."
    },
    {
      "path": "CHANGELOG.md",
      "line": 822,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Fixes BusyTeX project-source corruption that could surface as `Missing \\begin{document}` even when the editor source was valid. The TeXise worker bridge now normalizes both `{ content }` and `{ contents }` file shapes before calling `BusytexPipeline.compile()`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 830,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Fixed Full / SyncTeX pdfLaTeX starting BusyTeX with no TeX Live preload. TeXise now mounts `texlive-basic.js` before pdfLaTeX initialization, restoring `texmf.cnf` and the prebuilt `pdflatex.fmt` expected by the BusyTeX pipeline."
    },
    {
      "path": "CHANGELOG.md",
      "line": 836,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Fixes release incoherency where a newly activated service worker could control an already-open tab that was still executing an older TeXise JavaScript bundle."
    },
    {
      "path": "CHANGELOG.md",
      "line": 857,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Pins `busytex_pipeline.js` and `busytex_worker.js` to the known v1.4 build release (`46ebb62`) when TeXise provisions `texlyre-busytex@1.4.0`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 868,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Rotates the app-shell cache generation so an activating Build Fix 8 worker removes the older `texise-app-shell-*` cache that can contain an unpatched `busytex_pipeline.js`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 869,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Registers the TeXise service worker with `updateViaCache: 'none'` from both startup and compiler bootstrap paths so an upgrade checks the service-worker script without reusing an HTTP-cached copy."
    },
    {
      "path": "CHANGELOG.md",
      "line": 881,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Runs LiteRT-LM inference from the normal browser ESM context documented by Google while retaining OPFS model download/storage in the TeXise worker, fixing the module-worker `importScripts()` crash."
    },
    {
      "path": "CHANGELOG.md",
      "line": 883,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Moves the floating TeXise AI launcher left of the Terminal launcher so the controls no longer overlap."
    },
    {
      "path": "CHANGELOG.md",
      "line": 894,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Migrates preserved TeXise-owned BusyTeX `1.3.0` and `1.3.1` defaults to `1.4.0` before browser compiler provisioning; BusyTeX 1.4 added the Biber assets required by TeXise full compiler mode."
    },
    {
      "path": "CHANGELOG.md",
      "line": 907,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Kept intentional modal/terminal autofocus and complex TeXise hook trigger patterns visible as warnings instead of build-blocking errors; all other Biome recommended/error rules remain enabled."
    },
    {
      "path": "CHANGELOG.md",
      "line": 934,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added `runtime doctor`, `runtime status --json`, and `runtime reset <python|r|wasi|all>` terminal commands so browser/deployment problems are diagnosable in-app and failed/aborted heavy runtimes can be recovered without reloading the TeXise workspace."
    },
    {
      "path": "CHANGELOG.md",
      "line": 941,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Integrated the zero-download browser test into the normal release E2E matrix and made the heavyweight external-runtime gate opt-in through `TEXISE_SCIENTIFIC_RUNTIME_LIVE=1`; release certification records whether the live scientific gate actually ran rather than claiming it unconditionally."
    },
    {
      "path": "CHANGELOG.md",
      "line": 945,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- Added `ProjectResearchWorkflowService` to build deterministic provenance across datasets, analysis generators, generated research artifacts and LaTeX manuscript references without asking the language model to infer relationships already known by TeXise."
    },
    {
      "path": "CHANGELOG.md",
      "line": 952,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added a full Results-proposal review card with evidence paths, notes and complete proposed manuscript text. Applying it always creates a pending TeXise review change at the existing Results section (or creates a Results section before Discussion/Conclusion/end-document) rather than silently changing canonical LaTeX."
    },
    {
      "path": "CHANGELOG.md",
      "line": 957,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Enabled bounded Terminal AI Agent mode over the existing structured TeXise tool registry; the model never receives an unrestricted shell or generic command executor."
    },
    {
      "path": "CHANGELOG.md",
      "line": 962,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Preserved manuscript review boundaries: Agent plans cannot directly write LaTeX source; manuscript changes continue through TeXise review/track-change flows rather than an Agent file-write tool."
    },
    {
      "path": "CHANGELOG.md",
      "line": 975,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Deliberately did not expose Gnuplot in this release because no current certified browser Wasmer/WASI package was verified; TeXise continues to use Matplotlib and R/webR as the supported scientific plotting paths."
    },
    {
      "path": "CHANGELOG.md",
      "line": 998,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- HTTP downloads written with `curl -o` are registered as canonical TeXise research artifacts with HTTP provenance and appear in the existing Results surface; large/binary responses must be saved rather than flooding the terminal transcript."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1010,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Manuscript insertion respects TeXise Track Changes: when enabled, figure/table insertion becomes a pending review change rather than silently mutating canonical source."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1011,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Generated-artifact previews and insertion continue to use canonical TeXise storage; no separate terminal/results filesystem was introduced."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1030,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added the browser-only `@learnitive/r-browser` runtime adapter, pinned to webR 0.6.0 and loaded lazily. webR owns the R WebAssembly worker/channel, so opening TeXise or the terminal does not download R."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1032,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added terminal commands `R`, `R -e ...`, `Rscript analysis.R [args...]`, `webr info` and confirmed-network `webr install <package...>` for the TeXise-certified Wasm package catalogue."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1042,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added the browser-only `@learnitive/python-browser` runtime adapter, pinned to Pyodide 314.0.4 and loaded lazily in a dedicated module Web Worker so opening TeXise or the terminal does not download Python."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1046,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added worker-owned `/workspace` file operations used by the existing runtime mirror/artifact collector, preserving canonical TeXise storage as the source of truth."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1047,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added stdout/stderr capture, exit codes, timing/runtime metadata and Ctrl+C interruption. SharedArrayBuffer/SIGINT is used when cross-origin isolation is available; otherwise TeXise hard-terminates and lazily reconstructs the Python worker."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1059,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added `ProjectScientificRuntimeService` as the canonical scientific execution boundary and registered it with the TeXise core service container."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1060,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added `RuntimeWorkspaceBridge`: canonical TeXise project files are mirrored into an isolated runtime workspace before execution, `.git`/runtime noise is excluded, and current whole-file storage reads are bounded with explicit skipped-file reporting until streaming project reads are implemented."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1074,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added `isProjectReadableTextPath()` so TeXise AI/search may safely inspect LaTeX/Markdown plus scientific code/data text such as Python, R, C/C++, shell, CSV/TSV, JSON/YAML/TOML while keeping binary files opaque."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1077,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added `ProjectTerminalAiService`, reusing the configured TeXise AI provider and deterministic terminal/project/Git context instead of creating another model runtime or unrestricted shell agent."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1088,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Routed `tex`, `pdflatex`, `xelatex` and `lualatex` through the existing TeXise browser compiler instead of creating another compiler implementation."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1089,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Terminal file writes use TeXise storage services and loaded LaTeX files use the canonical `LatexSourceService`; destructive rename/delete operations are blocked while collaboration is active."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1145,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds inline metadata review for incomplete local PDF metadata; TeXise refuses to fabricate title/authors/year and persists researcher-reviewed metadata only after successful bibliography/citation actions."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1168,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Assigns immutable in-run `[S#]` evidence IDs from TeXise-owned paper/chunk/page metadata and validates every model citation against that registry."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1169,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- Keeps real PDF page numbers out of the model prompt; Gemma cites source IDs and TeXise renders page provenance from trusted application metadata."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1191,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Stores source PDFs OPFS-first under the versioned `texise-paper-memory/v1` namespace with IndexedDB fallback, and fingerprints actual PDF bytes with SHA-256 to prevent duplicate re-indexing."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1205,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds an in-run trusted evidence registry: TeXise assigns `[S#]` IDs, treats retrieved project text as untrusted evidence, sanitizes fabricated source IDs and requires source-cited final answers after RAG retrieval."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1206,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds clickable AI project-evidence cards rendered from TeXise metadata; persisted anchors are conservatively re-resolved before navigation and ambiguous stale evidence is rejected."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1224,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Makes the TeXise AI shell available to Free users across Source, Visual and PDF/full-preview workspace surfaces; cloud BYOK providers remain Pro-gated."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1240,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Preserves the scientific-trust boundary: provider metadata can identify candidate literature, but TeXise does not claim that metadata alone proves support, contradiction or absence from a paper."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1284,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Migrates the editor/PDF split preference to `texise:editor-pdf-split:v2`, ignores legacy v1 values, starts at a genuine 60/40 when v2 is absent, and persists only committed user resize/reset actions."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1309,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Falls back from the native PDF.js TextLayer to TeXise's lightweight compatibility text layer; if text rendering still fails, keeps a canvas-only page with a non-blocking warning."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1319,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Migrates only TeXise-owned legacy BusyTeX 1.3.1 / retired endpoint defaults in existing /etc/texise/texise.env files while preserving administrator overrides."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1337,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Add file-tree **Download source** for editable TeXise text files, preferring live canonical source snapshots over stale storage."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1373,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Completed the Bangle-to-TeXise star migration so the top-bar **Star this item** action persists arbitrary project files through the file-aware workspace path model, including LaTeX/BibTeX/style/class files and rename/move relocation."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1396,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added a persistent BusyTeX cache under `/var/cache/texise/compiler` so upgrades do not re-download/extract the 524 MB compiler runtime when the compiler version is unchanged."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1398,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Separated normal install/upgrade from formal release certification: deployments keep lint/type/compiler/static/build checks, while `TEXISE_DEPLOY_CERTIFY=1` or `pnpm run release:quality` runs the full unit + Edge/Chromium/Firefox certification matrix."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1407,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Updated stale workspace/project UI tests to the current TeXise file-first terminology, real-directory storage contract and current table test IDs."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1462,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added Texlyre-derived project-aware Source completions for citations, labels/references and project file paths while retaining TeXise's LaTeX command/environment completion."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1463,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added Ctrl/Cmd-click Source navigation for references, citations and project file commands through TeXise navigation and explicit source-selection semantics."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1464,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added Texlyre-style paste interception for project image/PDF assets, reusing TeXise's existing canonical asset import/insertion flow."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1495,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Replaced the TeXise Source CodeMirror foundation with a Texlyre-derived session/controller stack while keeping `.tex` canonical in `LatexSourceService`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1597,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Allow direct/reloaded editor routes for TeXise text files (`.tex`, `.ltx`, `.bib`, `.sty`, `.cls`, `.bst`, `.txt`) instead of inheriting Bangle's Markdown-only route decoder."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1606,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added TeXise-owned same-origin y-webrtc signaling plus SHA-256 collaboration asset manifests."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1627,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Removed user-visible Bangle homepage/GitHub/Twitter/Discord/privacy links from the TeXise product surface."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1632,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Missing SwiftLaTeX package files resolve on demand through a configurable remote endpoint and are cached in the browser; administrators can disable the remote by setting `TEXISE_TEXLIVE_REMOTE_URL=`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1635,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/etc/texise/texise.env` now controls compiler provisioning during installation/upgrade, and new compiler variables are merged into existing preserved env files without replacing administrator values."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1642,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- TeXise now creates a real blank LaTeX project (`main.tex` plus `figures/`) for every new empty browser/OPFS/native workspace and opens `main.tex` immediately."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1653,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Production source now lives directly at `/var/www/app.texise.com/public_html`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1655,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Apache serves only `/var/www/app.texise.com/public_html/dist`; the trusted API runs from `public_html/server`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1656,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Removed the R12 `/opt/texise` and timestamped frontend release/symlink deployment model."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1657,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Installer/upgrade now use frozen-lockfile PNPM dependencies, rebuild in place, validate API/frontend/SPA health, and preserve `/etc/texise`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1662,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- R13 Apache hotfix: installer disables the legacy Certbot `app.texise.com-le-ssl.conf` vhost when present and now propagates frontend health-check failures correctly."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1670,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "## 2026-08-20 — `/etc/texise` permission post-condition verification"
    },
    {
      "path": "CHANGELOG.md",
      "line": 1672,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Install/upgrade now verifies the protected `/etc/texise` owner/group/mode immediately after normalization and fails clearly if the live filesystem does not match the expected trust boundary."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1673,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Known TeXise configuration/signing files must be regular, non-symlink files and verify as `root:texise 0640`; `/etc/texise` verifies as `root:texise 0750`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1686,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Adds `texise-saas status|preflight|logs` operations helper."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1687,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Health-check failure now prints the recent `texise.service` journal automatically."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1688,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Documents production use of a custom database name such as `texise_db` and least-privilege grants."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1689,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Protects the reserved `admin@texise.com` bootstrap identity from silent privilege elevation."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1694,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- The supplied `Latinotype - Moranga Regular.otf` is canonicalized to `dist/texise-fonts/Moranga-Regular.otf`, matching the CSS runtime URL."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1696,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Production-dist validation now requires all three TeXise browser fonts before activation."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1697,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `TEXISE_FONT_SOURCE_DIR` defaults to `/var/www/app.texise.com/fonts` and is preserved/configurable in `/etc/texise/texise.env`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1704,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Renamed static template assets to `/texise-templates/*`, eliminating the Apache `/templates` directory collision; `/examples` now redirects to `/templates`."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1705,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Removed Markdown-only project-tree filtering from the TeXise LaTeX sidebar and corrected project-dialog privacy text styling."
    },
    {
      "path": "CHANGELOG.md",
      "line": 1733,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "Verification: 351/351 broad server/static tests PASS; 10/10 project-runtime PASS; migration tests 15/15 PASS; capability audit 32/32 with 0 blockers; lock sync, trusted runtime manifest, R12 release audit, Learnitive brand audit, TeXise provenance audit, installer syntax and server/Console Gateway syntax all PASS."
    },
    {
      "path": "CLAUDE.md",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "TeXise is a local-first scientific writing and LaTeX application. Projects are"
    },
    {
      "path": "CLAUDE.md",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "editing built on CodeMirror/ProseMirror and TeXise services. Workspaces can use"
    },
    {
      "path": "CLAUDE.md",
      "line": 83,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "rules are the `texiseWorkspaceConfig.allowedWorkspaces` fields in each"
    },
    {
      "path": "CLAUDE.md",
      "line": 101,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "Package metadata also declares `texisePackageConfig.env` (`browser`, `nodejs`,"
    },
    {
      "path": "CLAUDE.md",
      "line": 112,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "- `packages/core/editor`: TeXise editor service, save lifecycle, and"
    },
    {
      "path": "CLAUDE.md",
      "line": 277,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "accepted tradeoff. Use `TEXISE_PORT_SEED=<name>` when a worktree needs to share"
    },
    {
      "path": "CLAUDE.md",
      "line": 282,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_DEV_PORT` for `pnpm start`."
    },
    {
      "path": "CLAUDE.md",
      "line": 283,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_PREVIEW_PORT` for `pnpm preview-production`."
    },
    {
      "path": "CLAUDE.md",
      "line": 284,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_STORYBOOK_PORT` for `pnpm storybook`."
    },
    {
      "path": "CLAUDE.md",
      "line": 285,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_E2E_PORT` for the app server launched by `pnpm e2e:ci`."
    },
    {
      "path": "CLAUDE.md",
      "line": 286,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_E2E_CT_PORT` for the Playwright component-test server."
    },
    {
      "path": "CLAUDE.md",
      "line": 295,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`TEXISE_DEV_PORT=5317 pnpm start`."
    },
    {
      "path": "CLAUDE.md",
      "line": 317,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "`https://www.texise.com`; use the checked-in TeXise installer/deploy scripts"
    },
    {
      "path": "CLAUDE.md",
      "line": 327,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "against `https://www.texise.com/`, inspect browser console errors, and confirm"
    },
    {
      "path": "CONTRIBUTING.md",
      "line": 212,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "Production deployment is TeXise-specific and is intentionally not tied to an inherited upstream repository. Use the checked-in `scripts/install.sh`, `scripts/lib/texise-deploy.sh`, and `deploy/apache/` configuration for the canonical `https://www.texise.com` deployment. Do not deploy unless explicitly requested, and verify the release-quality gates before publishing."
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "the TeXise workspace. Keep it high-level: use it to choose slices, record outcomes, and"
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 145,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "- Preserve the workspace hierarchy and `texiseWorkspaceConfig.allowedWorkspaces`"
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 331,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`PATH=/tmp/texise-pnpm-shim:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games corepack pnpm install`;"
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 370,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`PATH=/tmp/texise-pnpm-shim:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games corepack pnpm install`;"
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 424,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`PATH=/tmp/texise-pnpm-shim:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games corepack pnpm install`;"
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 490,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "- [ ] Confirm the document title uses the TeXise route metadata."
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 598,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`PATH=/tmp/texise-pnpm-shim:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games corepack pnpm install`;"
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 660,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`PATH=/tmp/texise-pnpm-shim:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games corepack pnpm install`;"
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 718,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`PATH=/tmp/texise-pnpm-shim:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games corepack pnpm install`;"
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 768,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`PATH=/tmp/texise-pnpm-shim:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games corepack pnpm install`;"
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 820,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`PATH=/tmp/texise-pnpm-shim:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games corepack pnpm install`;"
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 867,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- [x] `pnpm install`: passed with `PATH=/tmp/texise-pnpm-shim:$PATH corepack pnpm install`; frozen install passed with `--frozen-lockfile`."
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 917,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`PATH=/tmp/texise-pnpm-shim:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games corepack pnpm install`;"
    },
    {
      "path": "DEPENDENCY_MODERNIZATION_TRACKER.md",
      "line": 1012,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`PATH=/tmp/texise-pnpm-shim:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games corepack pnpm install`."
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "# TeXise browser font deployment"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 3,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TeXise's licensed/product browser fonts are intentionally kept outside the redistributable source ZIP. The production installer loads them from an administrator-owned directory **after** the browser build, so rebuilding `dist/` cannot erase them."
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "/var/www/texise.com/fonts/"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "TEXISE_FONT_SOURCE_DIR=/var/www/texise.com/fonts"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 37,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "dist/texise-fonts/Inter-Variable.woff2"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 38,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "dist/texise-fonts/JetBrainsMono-Variable.woff2"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 39,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "dist/texise-fonts/Moranga-Light.otf"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 40,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "dist/texise-fonts/Moranga-Regular.otf"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 41,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "dist/texise-fonts/Moranga-RegularItalic.otf"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 42,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "dist/texise-fonts/Moranga-Bold.otf"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 43,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "dist/texise-fonts/STIXTwoText-VariableFont.ttf"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 44,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "dist/texise-fonts/STIXTwoText-Italic-Variable.ttf"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 66,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "cp -r ./fonts/* ./public_html/dist/texise-fonts/"
    },
    {
      "path": "FONT-ASSETS-REQUIRED.md",
      "line": 93,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "The source tree may contain TeX/BusyTeX font data used by the browser TeX distribution. Those compiler assets are distinct from this external browser typography bundle. The downloadable TeXise release produced in this environment omits font binaries; restore any compiler font assets from the authoritative TeXise source if required by your deployment process."
    },
    {
      "path": "NEXT_CHAT_CONTINUATION_PROMPT.md",
      "line": 20,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "- No user-controlled execution on the host; never mount Docker socket or expose Learnitive/TeXise secrets."
    },
    {
      "path": "NEXT_CHAT_CONTINUATION_PROMPT.md",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Do not touch `/etc/texise/*` or unrelated TeXise infrastructure."
    },
    {
      "path": "PROJECT_STATE_LEDGER.md",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "R12 installer/deployment logic is staging-hard-locked to `os.learnitive.com` and `/var/www/os.learnitive.com/public_html/`. Existing `texise.com`, `www.texise.com`, `texise-*` services, `learnitive.com`, and `www.learnitive.com` are protected resources and must not be modified. Generic existing systemd/config identities are only replaced when proven staging-owned. Existing generic service users are reused only when staging data ownership proves they belong to this deploym"
    },
    {
      "path": "PROJECT_STATE_LEDGER.md",
      "line": 114,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "- `installer.sh`: mode **0755**, zero case-insensitive `texise` references."
    },
    {
      "path": "PROJECT_STATE_LEDGER.md",
      "line": 130,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "`public_html/installer.sh` must be archived executable 0755 and contain zero case-insensitive `texise` references."
    },
    {
      "path": "PROJECT_STATE_LEDGER.md",
      "line": 212,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "A real staging install passed the unified Docker image/toolchain gate but failed `pnpm install --frozen-lockfile` because newly-added `@texise/project-runtime` workspace dependencies in `packages/core/service-core/package.json` and `packages/core/app/package.json` were not represented in the shipped lockfile."
    },
    {
      "path": "PROJECT_STATE_LEDGER.md",
      "line": 214,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The deeper issue was that the monorepo still exposed the old `@texise/*` internal workspace scope across 69 real workspace packages. Hotfix 4 migrates all workspace package names, imports, manifest dependency keys, tooling references, root scripts/config references, and lockfile dependency keys to `@learnitive/*`. The root workspace package identity is now `learnitive`."
    },
    {
      "path": "PROJECT_STATE_LEDGER.md",
      "line": 230,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "Explicit production-safety references to the separate TeXise deployment remain outside the workspace package namespace where they exist solely to prevent accidental modification of protected production resources."
    },
    {
      "path": "PROJECT_STATE_LEDGER.md",
      "line": 232,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "Hotfix 4 also removes the old product name from active build/release diagnostics touched by the staging build path: BusyTeX build preflight, compiler-status generation, production-dist activation, release metadata, lock-sync validation, workspace dependency-version validation, and public-barrel validation now identify themselves as Learnitive. Release metadata now uses `Learnitive`, `learnitive`, `learnitive-browser`, and the `www.learnitive.com` SPDX namespace."
    },
    {
      "path": "PROJECT_STATE_LEDGER.md",
      "line": 243,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "- Active Lucide build generator no longer emits `[TeXise]`; it emits `[Learnitive]`."
    },
    {
      "path": "PROJECT_STATE_LEDGER.md",
      "line": 387,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- the active browser stylesheet path was renamed from `ws-texise.css` to `ws-learnitive.css`, removing the remaining old-name filename from normal Vite build progress output."
    },
    {
      "path": "PROJECT_STATE_LEDGER.md",
      "line": 590,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "Verification: 351/351 broad server/static tests PASS; 10/10 project-runtime PASS; migration tests 15/15 PASS; capability audit 32/32 with 0 blockers; lock sync, trusted runtime manifest, R12 release audit, Learnitive brand audit, TeXise provenance audit, installer syntax and server/Console Gateway syntax all PASS."
    },
    {
      "path": "RANT.md",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "TeXise has multiple workspaces (dirs directly under `/packages`), and each workspace has a specific purpose and dependency tree. The field `texiseWorkspaceConfig.allowedWorkspaces` in the `package.json` file defines the allowed workspace a package in a workspace can depend on."
    },
    {
      "path": "README.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "# TeXise"
    },
    {
      "path": "README.md",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "The optional account/CMS/project-metadata SaaS layer preserves TeXise browser-local manuscript ownership and compilation. Deployment and upgrade documentation is in:"
    },
    {
      "path": "README.md",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `docs/TEXISE_SAAS_DB_ADMIN_SETUP.md`"
    },
    {
      "path": "README.md",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `docs/TEXISE_SAAS_ENVIRONMENT.md`"
    },
    {
      "path": "README.md",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `docs/TEXISE_SAAS_MIGRATION_NOTES.md`"
    },
    {
      "path": "README.md",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `docs/TEXISE_SAAS_VALIDATION_REPORT.md`"
    },
    {
      "path": "README.md",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `docs/TEXISE_SAAS_RELEASE_CHANGELOG.md`"
    },
    {
      "path": "README.md",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md`"
    },
    {
      "path": "README.md",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "TeXise is a browser-first, local-first LaTeX editor being built from the"
    },
    {
      "path": "README.md",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "`https://www.texise.com` and keeps user projects on the user's own storage"
    },
    {
      "path": "README.md",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "rather than requiring TeXise-hosted document storage."
    },
    {
      "path": "README.md",
      "line": 23,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "Git, collaboration, free browser-local Gemma AI, optional Pro cloud BYOK AI, and the signed TeXise Pro entitlement system while"
    },
    {
      "path": "README.md",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "TeXise includes a capability-safe project terminal rooted at `/workspace`. It can inspect and mutate the same local project shown in the file browser, run the existing browser LaTeX compiler, and edit scientific/code text files without granting access to arbitrary host files. R14.28.0 establishes the terminal/runtime boundary; local AI, Pyodide scientific Python, plotting, Git commands and WASI C/C++ tooling build on this same boundary in later phases."
    },
    {
      "path": "README.md",
      "line": 52,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "actually installed. R14.14 makes `TEXISE_COMPILER_PROFILE=full` the official"
    },
    {
      "path": "README.md",
      "line": 56,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "`/var/www/texise.com/public_html/texise-data/cache/compiler`; upgrades with"
    },
    {
      "path": "README.md",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "extracting the 524 MB runtime again. TeXise runtime data and public CMS media"
    },
    {
      "path": "README.md",
      "line": 59,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "remain inside `public_html/texise-data` and `public_html/texise-media`; protected"
    },
    {
      "path": "README.md",
      "line": 60,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "configuration and signing material remain under `/etc/texise`. Full deployments still prefer the"
    },
    {
      "path": "README.md",
      "line": 68,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "mirror, then `TEXISE_TEXLIVE_REMOTE_URL`. Without Service Worker control the"
    },
    {
      "path": "README.md",
      "line": 70,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "be configured with `TEXISE_TEXLIVE_STATIC_MIRROR_URL` and"
    },
    {
      "path": "README.md",
      "line": 71,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`TEXISE_TEXLIVE_LSR_URL`; set the remote URL empty for bundled/static-only use."
    },
    {
      "path": "README.md",
      "line": 77,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "TeXise is designed to run behind Apache2 at `www.texise.com`. Install the full"
    },
    {
      "path": "README.md",
      "line": 78,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "source tree at `/var/www/texise.com/public_html`; `pnpm run build` creates"
    },
    {
      "path": "README.md",
      "line": 79,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "the Apache-served production artifact at `/var/www/texise.com/public_html/dist`."
    },
    {
      "path": "README.md",
      "line": 81,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "`/var/www/texise.com/public_html/texise-data/runtime/current/server`, binds to `127.0.0.1:3100`, and is reverse-proxied under"
    },
    {
      "path": "README.md",
      "line": 83,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "`/etc/texise/*`."
    },
    {
      "path": "README.md",
      "line": 88,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "cd /var/www/texise.com/public_html"
    },
    {
      "path": "README.md",
      "line": 96,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`sudo env TEXISE_DEPLOY_CERTIFY=1 ./scripts/install.sh`."
    },
    {
      "path": "README.md",
      "line": 98,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "See [docs/texise-deployment.md](./docs/texise-deployment.md) and the"
    },
    {
      "path": "README.md",
      "line": 99,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[production release checklist](./docs/texise-release-checklist.md)."
    },
    {
      "path": "README.md",
      "line": 123,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "The official TeXise browser build does not embed operator analytics identifiers at build time. On the canonical production site, BF38 loads Statcounter on non-admin pages and can load an operator-configured Google Tag only after optional analytics-cookie acceptance. Production installation pins the local Ed25519 entitlement public key into the browser bundle, applies a Content-Security-Policy, and requires HTTPS for non-loopback custom AI endpoints. Local AI keeps manuscript/project context and "
    },
    {
      "path": "THIRD_PARTY_NOTICES.md",
      "line": 50,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "AGPL-3.0-or-later. TeXise itself remains AGPL-3.0-or-later; downloaded compiler"
    },
    {
      "path": "THIRD_PARTY_NOTICES.md",
      "line": 56,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TeXise uses PDF.js (`pdfjs-dist`) for in-browser PDF rendering."
    },
    {
      "path": "THIRD_PARTY_NOTICES.md",
      "line": 62,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TeXise uses MathLive (`mathlive`) for source-backed visual equation editing."
    },
    {
      "path": "THIRD_PARTY_NOTICES.md",
      "line": 68,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TeXise uses Yjs (`yjs`) for CRDT document state, `y-protocols` for awareness,"
    },
    {
      "path": "THIRD_PARTY_NOTICES.md",
      "line": 70,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "and awareness updates are carried through TeXise's same-origin WebSocket relay."
    },
    {
      "path": "THIRD_PARTY_NOTICES.md",
      "line": 74,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "Collaborative project text is mirrored into the user's selected TeXise project"
    },
    {
      "path": "THIRD_PARTY_NOTICES.md",
      "line": 84,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "distributed under AGPL-3.0-or-later, which is compatible with TeXise's"
    },
    {
      "path": "THIRD_PARTY_NOTICES.md",
      "line": 90,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "retaining TeXise's project Y.Doc, browser storage, compile pipeline and"
    },
    {
      "path": "THIRD_PARTY_NOTICES.md",
      "line": 92,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "of this TeXise distribution."
    },
    {
      "path": "THIRD_PARTY_NOTICES.md",
      "line": 96,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TeXise includes a locally hosted, TeXise-integrated adaptation of TikZ Draw"
    },
    {
      "path": "THIRD_PARTY_NOTICES.md",
      "line": 101,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "(ISC licence). TeXise does not load TikZ Draw or MathJax from a third-party"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 29,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "RUN python3 -m venv /opt/texise-venv; \\"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 30,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/opt/texise-venv/bin/python -m pip install --no-cache-dir --upgrade pip setuptools wheel; \\"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 31,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/opt/texise-venv/bin/python -m pip install --no-cache-dir --only-binary=:all: -r /tmp/requirements-scientific.txt; \\"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 32,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/opt/texise-venv/bin/python -c 'import numpy,scipy,pandas,matplotlib,sympy'; \\"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "ENV VIRTUAL_ENV=/opt/texise-venv \\"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 36,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "PATH=/opt/texise-venv/bin:${PATH}"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 38,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# Login shells may rebuild PATH from /etc/profile. Re-assert the TeXise virtual"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 42,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'export VIRTUAL_ENV=/opt/texise-venv' \\"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 43,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'case \":$PATH:\" in *\":/opt/texise-venv/bin:\"*) ;; *) export PATH=\"/opt/texise-venv/bin:$PATH\" ;; esac' \\"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 44,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "> /etc/profile.d/texise-venv.sh; \\"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 45,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "chmod 0644 /etc/profile.d/texise-venv.sh"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 52,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "LABEL com.texise.image.role=\"linux-terminal-pro\" \\"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 53,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "com.texise.image.schema=\"r14.28.14-bf12\" \\"
    },
    {
      "path": "deploy/docker/console/Dockerfile",
      "line": 54,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "com.texise.image.base=\"texlive/texlive:latest\""
    },
    {
      "path": "deploy/learnitive/install-staging.sh",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "TEMPLATE_PUBLIC_COPY=\"$DIST_ROOT/texise-templates\""
    },
    {
      "path": "deploy/learnitive/install-staging.sh",
      "line": 78,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "for protected in '/var/www/texise.com' '/var/www/www.texise.com' '/var/www/learnitive.com' '/var/www/www.learnitive.com' '/etc/texise'; do"
    },
    {
      "path": "deploy/learnitive/install-staging.sh",
      "line": 282,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "# build that removed dist/learnitive-media or dist/texise-templates can"
    },
    {
      "path": "deploy/learnitive/install-staging.sh",
      "line": 643,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if ! TEXISE_APP_ENV=staging LEARNITIVE_MEDIA_STAGE_ROOT=\"$MEDIA_ROOT\" pnpm_cmd build; then"
    },
    {
      "path": "deploy/learnitive/install-staging.sh",
      "line": 683,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "local packaged=\"$APP_ROOT/texise-templates\""
    },
    {
      "path": "deploy/learnitive/install-staging.sh",
      "line": 740,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "merge_media_tree \"$SITE_ROOT/texise-media\""
    },
    {
      "path": "deploy/learnitive/install-staging.sh",
      "line": 741,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "merge_media_tree \"$APP_ROOT/texise-media\""
    },
    {
      "path": "deploy/systemd/learnitive.service",
      "line": 32,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "ReadWritePaths=/var/www/os.learnitive.com/learnitive-data/audit /var/www/os.learnitive.com/learnitive-data/cache /var/www/os.learnitive.com/learnitive-data/tmp/queue /var/www/os.learnitive.com/learnitive-data/log /var/www/os.learnitive.com/learnitive-data/templates /var/www/os.learnitive.com/learnitive-media/blog /var/www/os.learnitive.com/learnitive-media/docs /var/www/os.learnitive.com/learnitive-me"
    },
    {
      "path": "deploy/systemd/texise-console-gateway.service",
      "line": 2,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "Description=TeXise TexLab Docker gateway"
    },
    {
      "path": "deploy/systemd/texise-console-gateway.service",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "WorkingDirectory=/var/www/texise.com/public_html/texise-services/console-gateway"
    },
    {
      "path": "deploy/systemd/texise-console-gateway.service",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "EnvironmentFile=/etc/texise/console-gateway.env"
    },
    {
      "path": "deploy/systemd/texise-console-gateway.service",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ExecStart=/usr/bin/node /var/www/texise.com/public_html/texise-services/console-gateway/server.js"
    },
    {
      "path": "deploy/systemd/texise-console-gateway.service",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "User=texise-console"
    },
    {
      "path": "deploy/systemd/texise-console-gateway.service",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "Group=texise-console"
    },
    {
      "path": "deploy/systemd/texise-console-gateway.service",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ReadOnlyPaths=/var/www/texise.com/public_html/texise-services/console-gateway"
    },
    {
      "path": "deploy/systemd/texise-console-gateway.service",
      "line": 30,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ReadWritePaths=/var/www/texise.com/public_html/texise-data/tmp/console"
    },
    {
      "path": "deploy/systemd/texise-console-gateway.service",
      "line": 31,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "InaccessiblePaths=/etc/texise"
    },
    {
      "path": "deploy/systemd/texise-latex-compile.service",
      "line": 2,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "Description=TeXise private Docker-isolated LaTeX Cloud Compile service"
    },
    {
      "path": "deploy/systemd/texise-latex-compile.service",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "WorkingDirectory=/var/www/texise.com/public_html/texise-services/cloud-compile"
    },
    {
      "path": "deploy/systemd/texise-latex-compile.service",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "EnvironmentFile=/etc/texise/cloud-compile.env"
    },
    {
      "path": "deploy/systemd/texise-latex-compile.service",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ExecStart=/usr/bin/node /var/www/texise.com/public_html/texise-services/cloud-compile/server.js"
    },
    {
      "path": "deploy/systemd/texise-latex-compile.service",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "User=texise-compile"
    },
    {
      "path": "deploy/systemd/texise-latex-compile.service",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "Group=texise-compile"
    },
    {
      "path": "deploy/systemd/texise-latex-compile.service",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ReadOnlyPaths=/var/www/texise.com/public_html/texise-services/cloud-compile"
    },
    {
      "path": "deploy/systemd/texise-latex-compile.service",
      "line": 30,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ReadWritePaths=/var/www/texise.com/public_html/texise-data/tmp/cloud-compile"
    },
    {
      "path": "deploy/systemd/texise-latex-compile.service",
      "line": 31,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "InaccessiblePaths=/etc/texise"
    },
    {
      "path": "deploy/systemd/texise.service",
      "line": 2,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "Description=TeXise trusted API (accounts, licensing, CMS, scholarly and AI fallback)"
    },
    {
      "path": "deploy/systemd/texise.service",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "User=texise"
    },
    {
      "path": "deploy/systemd/texise.service",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "Group=texise"
    },
    {
      "path": "deploy/systemd/texise.service",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "WorkingDirectory=/var/www/texise.com/public_html/texise-data/runtime/current/server"
    },
    {
      "path": "deploy/systemd/texise.service",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "EnvironmentFile=/etc/texise/texise.env"
    },
    {
      "path": "deploy/systemd/texise.service",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "EnvironmentFile=/var/www/texise.com/public_html/texise-data/runtime/current/release.env"
    },
    {
      "path": "deploy/systemd/texise.service",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ExecStart=/usr/bin/node /var/www/texise.com/public_html/texise-data/runtime/current/server/index.mjs"
    },
    {
      "path": "deploy/systemd/texise.service",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ReadOnlyPaths=/etc/texise /var/www/texise.com/public_html/texise-data/runtime/current"
    },
    {
      "path": "deploy/systemd/texise.service",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ReadWritePaths=/var/www/texise.com/public_html/texise-data/audit /var/www/texise.com/public_html/texise-data/cache /var/www/texise.com/public_html/texise-data/tmp /var/www/texise.com/public_html/texise-data/log /var/www/texise.com/texise-media/blog /var/www/texise.com/texise-media/docs /var/www/texise.com/templates /var/www/texise.com/public_html/dist/texise-templates /var/www/texise.com/public_html/dist/texise-media"
    },
    {
      "path": "docs/BF32-TX7-IMPLEMENTATION-STATE.md",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Make live TeXise collaboration deliberately boring and reliable: one Source editor state, one Y.Text authority and one Yjs Awareness cursor representation. Alice typing must immediately produce the same text in Bob's Source editor with Alice's named caret at the same logical position."
    },
    {
      "path": "docs/BF32-TX7-IMPLEMENTATION-STATE.md",
      "line": 27,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- TX7 protocol and `texise-collaboration-v7` persistence namespace."
    },
    {
      "path": "docs/BF32-TX7-IMPLEMENTATION-STATE.md",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Stable awareness `user` identity; `texiseSession` only for protocol/role/host verification; `cursor` owned by y-codemirror."
    },
    {
      "path": "docs/BF32-TX7-IMPLEMENTATION-STATE.md",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- No TeXise custom Source relative-position presence, no collaboration authorship, no Follow/Open, no Visual live projection, no shared review/activity maps."
    },
    {
      "path": "docs/BF32-TX7-IMPLEMENTATION-STATE.md",
      "line": 72,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `node scripts/texise-release-audit.mjs` — PASS, 350/350 static contracts."
    },
    {
      "path": "docs/BF32-TX7-IMPLEMENTATION-STATE.md",
      "line": 73,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `node scripts/texise-saas-static-audit.mjs` — PASS, 43/43."
    },
    {
      "path": "docs/BF32-TX7-IMPLEMENTATION-STATE.md",
      "line": 97,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The formal soak is implemented as an opt-in/release-quality Playwright test: two independent browser contexts, exactly 10,000 deterministic Yjs text transactions in 250-edit batches, two offline/reconnect windows, periodic file switching and Yjs undo/redo, checkpoint comparisons of both Y.Text replicas and both one-way LatexSource mirrors, and final CodeMirror tail verification. `TEXISE_RELEASE_QUALITY=1` makes this soak mandatory in formal release quality; `TEXISE_TX7_SOAK=1` can run it directl"
    },
    {
      "path": "docs/BF33-TX7.1-IMPLEMENTATION-STATE.md",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Fresh SaaS startup no longer creates `admin@texise.com` with a known password."
    },
    {
      "path": "docs/BF33-TX7.1-IMPLEMENTATION-STATE.md",
      "line": 14,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- The operator provisions or resets the reserved administrator explicitly with `sudo texise-saas admin-create`; password entry requires an interactive TTY, explicitly disables terminal echo, and is not passed via command argv/environment files."
    },
    {
      "path": "docs/BF33-TX7.1-IMPLEMENTATION-STATE.md",
      "line": 40,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- The recovery directory `.texise-local-recovery/` is excluded from collaboration snapshots."
    },
    {
      "path": "docs/BF33-TX7.1-IMPLEMENTATION-STATE.md",
      "line": 42,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Extra local files/directories and same-path files changed locally since that baseline are preserved under `.texise-local-recovery/<timestamp>/...` before the current collaborative snapshot overwrites/deletes them."
    },
    {
      "path": "docs/BF33-TX7.1-IMPLEMENTATION-STATE.md",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Production CSP no longer permits arbitrary `wss:` destinations; it permits the canonical TeXise WebSocket origin while preserving required HTTPS provider access."
    },
    {
      "path": "docs/BF33-TX7.1-IMPLEMENTATION-STATE.md",
      "line": 98,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "sudo texise-saas admin-create"
    },
    {
      "path": "docs/BF36-TX7.2.2-IMPLEMENTATION-STATE.md",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Polish TeXise collaboration and account UX without changing the proven TX7/TX7.2.1 manuscript or shared-review architecture. BF36 removes unnecessary collaboration-dialog controls, uses trusted authenticated account identity for live collaboration, unifies account navigation, installs responsive official TeXise brand assets, and simplifies Settings account/entitlement presentation."
    },
    {
      "path": "docs/BF36-TX7.2.2-IMPLEMENTATION-STATE.md",
      "line": 24,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "A shared `TexiseAccountPopover` now serves SaaS/public headers and the editor top bar using the existing `texise-account-popover` visual language."
    },
    {
      "path": "docs/BF36-TX7.2.2-IMPLEMENTATION-STATE.md",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- `/texise-logo.png` — horizontal desktop/tablet TeXise logo;"
    },
    {
      "path": "docs/BF36-TX7.2.2-IMPLEMENTATION-STATE.md",
      "line": 46,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `/texise-logo-mobile.png` — compact square mobile logo."
    },
    {
      "path": "docs/BF36-TX7.2.2-IMPLEMENTATION-STATE.md",
      "line": 48,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The shared Brand component now uses `<picture>` with the existing compact breakpoint (`max-width: 48rem`) to select the mobile asset. `.texise-brand` remains only the structural accessible home-link wrapper. Active `texise-brand-mark` and `texise-brand-word` generated-brand markup/styles are removed."
    },
    {
      "path": "docs/BF36-TX7.2.2-IMPLEMENTATION-STATE.md",
      "line": 108,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- service-worker cache: `texise-app-shell-r14-28-17-buildfix36-v1`;"
    },
    {
      "path": "docs/BF37-TX7.2.3-IMPLEMENTATION-STATE.md",
      "line": 60,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`/texise-logo.png`"
    },
    {
      "path": "docs/BF37-TX7.2.3-IMPLEMENTATION-STATE.md",
      "line": 66,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The existing compact/mobile `/texise-logo-mobile.png` remains unchanged. The shared responsive `<picture>` brand implementation introduced in BF36 is retained."
    },
    {
      "path": "docs/BF37-TX7.2.3-IMPLEMENTATION-STATE.md",
      "line": 85,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "> The TexLab server Linux terminal requires a signed-in TeXise Pro account so terminal sessions can be isolated and owned by one user."
    },
    {
      "path": "docs/BF37-TX7.2.3-IMPLEMENTATION-STATE.md",
      "line": 158,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- service-worker cache: `texise-app-shell-r14-28-18-buildfix37-v1`;"
    },
    {
      "path": "docs/BF37-TX7.2.3-IMPLEMENTATION-STATE.md",
      "line": 215,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- runs the checker through `texise_collaboration_live_health_check`, which exports `/etc/texise/texise.env` only inside the subprocess so the root-owned signing secret never appears in command arguments;"
    },
    {
      "path": "docs/BF38-FAVICON-SOCIAL-COOKIE-ANALYTICS-IMPLEMENTATION-STATE.md",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Ship the supplied TeXise favicon artwork, add Facebook/X public social surfaces, add a persistent optional-cookie notice, enable Statcounter on every production non-admin surface regardless of the optional-cookie choice, and provision an optional Google Analytics / Google Tag ID through `/etc/texise/texise.env` that loads only after explicit acceptance."
    },
    {
      "path": "docs/BF38-FAVICON-SOCIAL-COOKIE-ANALYTICS-IMPLEMENTATION-STATE.md",
      "line": 13,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Replaced the six production favicon/PWA image assets with the exact files from `texise-favicon.zip`."
    },
    {
      "path": "docs/BF38-FAVICON-SOCIAL-COOKIE-ANALYTICS-IMPLEMENTATION-STATE.md",
      "line": 14,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Preserved TeXise's generated `site.webmanifest` / legacy `manifest.webmanifest` instead of installing the uploaded generic `MyWebSite` manifest."
    },
    {
      "path": "docs/BF38-FAVICON-SOCIAL-COOKIE-ANALYTICS-IMPLEMENTATION-STATE.md",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Production head retains the requested favicon, shortcut, Apple touch and site-manifest links plus `apple-mobile-web-app-title=TeXise`."
    },
    {
      "path": "docs/BF38-FAVICON-SOCIAL-COOKIE-ANALYTICS-IMPLEMENTATION-STATE.md",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "- Added Facebook (`https://www.facebook.com/TeXiser/`) and X (`https://x.com/texiser`) footer links."
    },
    {
      "path": "docs/BF38-FAVICON-SOCIAL-COOKIE-ANALYTICS-IMPLEMENTATION-STATE.md",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Added a fixed public-site X CTA for `@texiser`, hidden while the cookie notice is open and omitted from application/editor/admin surfaces."
    },
    {
      "path": "docs/BF38-FAVICON-SOCIAL-COOKIE-ANALYTICS-IMPLEMENTATION-STATE.md",
      "line": 18,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Added `texise-cookie-consent-v1` local-storage preference with Accept/Decline actions."
    },
    {
      "path": "docs/BF38-FAVICON-SOCIAL-COOKIE-ANALYTICS-IMPLEMENTATION-STATE.md",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Added optional `TEXISE_GOOGLE_TAG_ID=` provisioning to `/etc/texise/texise.env` and the checked-in env example."
    },
    {
      "path": "docs/BF38-FAVICON-SOCIAL-COOKIE-ANALYTICS-IMPLEMENTATION-STATE.md",
      "line": 41,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GOOGLE_TAG_ID=G-XXXXXXXXXX"
    },
    {
      "path": "docs/BF38-FAVICON-SOCIAL-COOKIE-ANALYTICS-IMPLEMENTATION-STATE.md",
      "line": 44,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "in `/etc/texise/texise.env` and restart the trusted TeXise service. A blank value disables Google analytics without affecting Statcounter."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 5,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Removes `texise-why-card-visual`, `FeatureVisual`, `MiniVisual`, and all mini-workspace styling so the cards are simpler and shorter."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 7,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Sets `.texise-why-card-pin` to `background: #f5f3ed`."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Adds a new `Why TeXise? / Built Different` homepage section immediately after the hero, adapted to the requested Prefix-style card language while keeping TeXise branding and truthful product claims."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Exactly three large TeXise-yellow cards are visible initially: `Privacy First`, `Local Compilation`, and `Live Collaboration`."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Cards use TeXise Moranga display headings, body copy, a white mini-workspace strip, and a small protruding icon badge; no Prefix/Pixi/Thetapad branding or external reference assets are copied."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 18,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "- Preserves Hotfix 5 hero corrections: wider rounded desktop PDF, Terminal confined to Source/Visual column, body-font `@TeXiser`, exact 4% yellow hero gradient, and configured Pro CTA."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `.texise-home-hero-v2` now uses exactly `linear-gradient(180deg, color-mix(in srgb, var(--texise-yellow) 4%, var(--background)) 0%, var(--background) 25%, var(--background) 100%)`."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 24,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- The desktop `.texise-hero-pdf-page` grows to `min(94%, 15rem)` with `.55rem` rounded corners."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 25,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- The simulated Terminal is rendered inside `.texise-hero-workspace-source`; opening it splits only the Source/Visual column into editor + 10rem Terminal while Files and PDF retain their full grid height."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "- The floating `@TeXiser` CTA uses `var(--texise-font-body)` again."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Directly below the hero title, `Open Workspace` links to `/projects` and outlined `Buy Pro $29` uses the runtime public `shopUrl` sourced from `TEXISE_SHOP`. No storefront URL is hard-coded."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Source comparison layer now has a fully opaque TeXise background at both the clipped layer and Source preview root, preventing Visual manuscript text from showing through Source code."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Release: **TeXise R14.28.20 Build Fix 39 — Source/Visual Reveal + Mobile Toolbar Hotfix 3**"
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 46,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "BF39.2 extends the public homepage simulation with a Source↔Visual reveal slider and makes the real editor toolbar horizontally scrollable on mobile. It also applies Moranga to the floating `@TeXiser` CTA and removes the decorative hero glow. Collaboration, review, compiler, accounts, TexLab, cookie-consent and BF38 analytics semantics are unchanged."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "3. A taller interactive **simulated** TeXise editor session."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- A TeXise-yellow Source↔Visual divider automatically oscillates between about 22% and 78%, can be dragged by mouse/touch/pen, supports keyboard slider controls, and pauses after direct interaction."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 67,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- **Terminal** is deliberately highlighted with TeXise yellow and a one-time invitation glow. Clicking it opens a dark simulated local terminal with `python analysis.py`, row/mean/std-dev results and an `Analysis complete.` message. Clicking Terminal again or the close button dismisses it."
    },
    {
      "path": "docs/BF39-HOMEPAGE-HERO-IMPLEMENTATION-STATE.md",
      "line": 78,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Real mobile editor: `.texise-editor-toolbar` uses native horizontal scrolling, no wrapping, hidden scrollbars and non-shrinking controls."
    },
    {
      "path": "docs/BF51_1_PRODUCTION_HARDENING.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise R14.28.20 Build Fix 51.1 — Production Hardening"
    },
    {
      "path": "docs/BF51_1_PRODUCTION_HARDENING.md",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Build Fix 51.1 hardens the BF51 growth/search/Ollama release without changing TeXise's core editor or authoritative compile model. It closes two production-correctness findings from the post-BF51 audit and deepens the comparison/search and Live PDF diagnostic boundaries."
    },
    {
      "path": "docs/BF51_1_PRODUCTION_HARDENING.md",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "A browser connection to `127.0.0.1:11434` is not, by itself, proof that model inference remains local. Ollama may expose remote/cloud-backed models through its local API. TeXise therefore reads `remote_model` and `remote_host`, rejects remote/cloud-backed entries from local-service AI, inspects the selected model through `/api/show`, and validates it immediately before configured Ollama inference. Privacy Mode only treats a model as local-service AI after this validation."
    },
    {
      "path": "docs/BF51_1_PRODUCTION_HARDENING.md",
      "line": 27,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "The comparison audit checks source IDs, row provenance, SEO uniqueness, verification freshness, guide depth and membership. TeXise Free-plan comparison claims no longer hard-code the default project count; the product limit remains deployment-configurable through `TEXISE_FREE_PLAN_LIMIT`."
    },
    {
      "path": "docs/BF51_1_PRODUCTION_HARDENING.md",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "IndexNow keeps its safe canonical BF51 URL set as a fallback and can additionally consume a deployment-generated changed-URL manifest through `TEXISE_INDEXNOW_URLS_FILE`. Off-origin URLs are rejected and IndexNow remains non-fatal after a healthy deployment."
    },
    {
      "path": "docs/BF51_1_PRODUCTION_HARDENING.md",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise-app-shell-r14-28-20-buildfix51-1-v1`"
    },
    {
      "path": "docs/BF51_1_PRODUCTION_HARDENING.md",
      "line": 59,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Run `TEXISE_OLLAMA_MODEL=<installed-local-model> pnpm run release:ollama-local` on the deployment host/user environment that owns the local Ollama service. The command is intentionally loopback-only. It verifies `/api/version`, `/api/tags`, rejects `remote_model`/`remote_host`, validates `/api/show` completion capability and executes a real `/v1/chat/completions` request. This complements the deterministic Playwright test; it does not replace the browser/CORS certification against the deployed H"
    },
    {
      "path": "docs/BF51_2_TEXPOSIT_OLLAMA_WORKFLOW.md",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Make TeXise's Ollama experience match the workflow documented by Texposit while keeping Ollama entirely on the user's computer and preserving BF51.1's verification that \"Local Ollama\" is genuinely local."
    },
    {
      "path": "docs/BF51_2_TEXPOSIT_OLLAMA_WORKFLOW.md",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "3. Opening the TeXise AI Assistant automatically probes `http://localhost:11434`."
    },
    {
      "path": "docs/BF51_2_TEXPOSIT_OLLAMA_WORKFLOW.md",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "7. If Ollama stops, TeXise automatically falls back to the last configured BYOK AI provider when one is available and Privacy Mode is off."
    },
    {
      "path": "docs/BF51_2_TEXPOSIT_OLLAMA_WORKFLOW.md",
      "line": 20,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "The TeXise server does not install, launch, proxy or depend on Ollama. The web browser connects directly to the Ollama service running on the user's own computer. Server-side release CI uses mocked browser endpoints only."
    },
    {
      "path": "docs/BF51_2_TEXPOSIT_OLLAMA_WORKFLOW.md",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "BF51.1's privacy boundary is preserved. A localhost Ollama daemon can expose remote/cloud-backed models, so TeXise continues to inspect `remote_model`, `remote_host` and `/api/show` before manuscript context is sent. Remote/cloud-backed models are unavailable in Local Ollama mode."
    },
    {
      "path": "docs/BF51_2_TEXPOSIT_OLLAMA_WORKFLOW.md",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "The fallback uses the user's most recently configured browser-held BYOK AI profile. TeXise does not provide a server-funded fallback credential. If there is no usable BYOK profile, the request fails with guidance to restart Ollama or configure BYOK AI."
    },
    {
      "path": "docs/BF51_3_OLLAMA_CLOUD_SUPPORT.md",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "TeXise connects from the browser to the Ollama service on the user's computer. The TeXise server does not install, run or proxy Ollama."
    },
    {
      "path": "docs/BF51_4_PUBLIC_CHANGE_LOG_CMS.md",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "BF51.4 adds a public, database-backed `/change-log` page so TeXise users can see recent product changes without requiring a source release for every content update. Administrators manage the page copy and dated change events from `/admin/change-log`."
    },
    {
      "path": "docs/BF51_4_PUBLIC_CHANGE_LOG_CMS.md",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The configurable Free-plan token `{{TEXISE_FREE_PLAN_LIMIT}}` is resolved consistently in both the live public API and crawler-visible server prerender."
    },
    {
      "path": "docs/BF51_4_PUBLIC_CHANGE_LOG_CMS.md",
      "line": 40,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise-app-shell-r14-28-20-buildfix51-4-v1`"
    },
    {
      "path": "docs/BF51_4_PUBLIC_CHANGE_LOG_CMS.md",
      "line": 65,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Chrome/Chromium can display a Local Network Access permission prompt when a secure TeXise page first contacts the user's loopback Ollama service. Earlier BF51.2/BF51.3 behavior probed `localhost:11434` when the AI Assistant or AI Settings opened, which could surface that browser prompt even when the user intended to keep using Local AI or BYOK AI."
    },
    {
      "path": "docs/BF51_4_PUBLIC_CHANGE_LOG_CMS.md",
      "line": 67,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Fix 3 removes those unsolicited probes, including passive startup probing when Ollama was saved previously. TeXise now accesses Ollama only after an explicit Ollama action (**Use Ollama**, selecting **Ollama · Local + Cloud**, **Refresh Ollama**) or when the user actually starts an AI request while Ollama is already the selected provider. Migration 25 updates untouched canonical AI/Ollama documentation and records the behavior change in the public Change log. The browser E2E contract asserts zer"
    },
    {
      "path": "docs/BF51_4_PUBLIC_CHANGE_LOG_CMS.md",
      "line": 73,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- TeXise does not probe `localhost:11434` during passive app startup or merely because the AI Assistant or AI Settings opens. The first probe is initiated only when the user explicitly chooses/refreshes Ollama, or starts an AI request while Ollama is already the selected provider."
    },
    {
      "path": "docs/BF51_4_PUBLIC_CHANGE_LOG_CMS.md",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- This prevents Chrome/Edge Local Network Access permission from appearing during ordinary TeXise browsing."
    },
    {
      "path": "docs/BF51_4_PUBLIC_CHANGE_LOG_CMS.md",
      "line": 75,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `/change-log` keeps substantive server-prerendered HTML for SEO, but wraps it in a CSS-readiness guard. The prerender is hidden with browser-default styling and becomes visible as soon as the production SaaS stylesheet defines `--texise-prerender-visibility: visible`; React then replaces it normally. This removes the flash of raw unstyled text without deleting the initial HTML."
    },
    {
      "path": "docs/BF51_GROWTH_AI_SEARCH_OLLAMA.md",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- **Local AI** runs TeXise's downloaded browser model in the browser."
    },
    {
      "path": "docs/BF51_GROWTH_AI_SEARCH_OLLAMA.md",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Initial Ollama HTTP targets are deliberately restricted to `localhost` and `127.0.0.1`. Production CSP allows those loopback targets only. Users must configure Ollama to allow `https://www.texise.com` with its current `OLLAMA_ORIGINS` mechanism."
    },
    {
      "path": "docs/HOTFIX10_BRANDING_PROVENANCE_AUDIT.md",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "TeXise is the product/platform identity across public pages, SEO, PWA metadata, editor UI, Terminal UI, Admin, current operational documentation and generated public assets."
    },
    {
      "path": "docs/HOTFIX10_BRANDING_PROVENANCE_AUDIT.md",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Product-facing uses of the inherited `TexLab` name have been normalized to `TeXise Terminal`/`Terminal`. `TeXiser` is not used as a second product name; `@texiser`/`@TeXiser` remains only where it is the genuine social handle/display spelling."
    },
    {
      "path": "docs/HOTFIX10_BRANDING_PROVENANCE_AUDIT.md",
      "line": 19,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "Current public HTML, PWA metadata, server SEO and user-facing runtime surfaces are fail-closed under `scripts/verify-texise-branding.mjs`."
    },
    {
      "path": "docs/HOTFIX10_BRANDING_PROVENANCE_AUDIT.md",
      "line": 23,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "This audit does not relabel third-party software as TeXise and does not remove legally required provenance."
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX42_PRODUCTION_TYPECHECK_FIX.md",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Product: TeXise"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX42_PRODUCTION_TYPECHECK_FIX.md",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- The same fixtures now use the Hotfix10 protected `/api/templates/{slug}/files/...` URLs rather than obsolete raw `texise-templates/free/...` URLs."
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX44_TRUSTED_RUNTIME_TEMPLATE_FIX.md",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "Build Fix 43 passed dependency installation, custom validation, strict TypeScript, Biome, BusyTeX provisioning, the complete static release audit and the production Vite build. Activation then failed when `texise.service` started the staged trusted runtime:"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX44_TRUSTED_RUNTIME_TEMPLATE_FIX.md",
      "line": 10,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`ERR_MODULE_NOT_FOUND: .../texise-data/runtime/current/scripts/generate-template-manifest.mjs`"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX44_TRUSTED_RUNTIME_TEMPLATE_FIX.md",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Admin filesystem operations use `/var/www/texise.com/public_html/texise-templates` while Assets Sync publishes the live catalog into `/var/www/texise.com/public_html/dist/texise-templates`;"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX44_TRUSTED_RUNTIME_TEMPLATE_FIX.md",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- systemd grants the `texise` service account write access only to those two template paths in addition to its existing data/media paths;"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX45_APACHE_HOMEPAGE_ROUTING_FIX.md",
      "line": 14,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- routes the empty per-directory path (`/`) directly to `http://127.0.0.1:3100/__texise/render/`;"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX45_APACHE_HOMEPAGE_ROUTING_FIX.md",
      "line": 20,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The trusted renderer still reads the built `dist/index.html` as its immutable application shell and injects route-specific SEO metadata. External `/__texise/*` access remains blocked by Apache."
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX46_TEMPLATE_PREVIEW_HOME_WORKFLOWS.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise R14.28.20 Build Fix 46 — Template Preview + Homepage Workflows"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX46_TEMPLATE_PREVIEW_HOME_WORKFLOWS.md",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "If no explicit preview is configured, TeXise automatically uses a root-level `template.pdf`, then `main.pdf`, when present. Clearing an uploaded preview automatically falls back to those files without deleting them. The template manifest records whether preview media is an image or PDF; PDF previews are embedded on template detail pages but never emitted as Open Graph/sitemap images."
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX46_TEMPLATE_PREVIEW_HOME_WORKFLOWS.md",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "`TeXise — Privacy First Research / Writing Platform`"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX46_TEMPLATE_PREVIEW_HOME_WORKFLOWS.md",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "with the existing underline treatment on `Writing Platform`. Capability labels are now exactly `Research`, `Code`, and `Document`. Server/client/static SEO title metadata is aligned to `TeXise — Privacy First Research Writing Platform`."
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX46_TEMPLATE_PREVIEW_HOME_WORKFLOWS.md",
      "line": 23,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "A new alternating-card section is rendered immediately after Built Awesome. The layout is TeXise-native and responsive, modeled on the supplied structural reference without copying its branding/content. Four temporary workflow stories and the existing local TeXise OG artwork are used as placeholders until final copy and images are supplied."
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX47_NAVIGABLE_TEMPLATE_DIRECTORY.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise R14.28.20 Build Fix 47 — Navigable Template Directory"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX47_NAVIGABLE_TEMPLATE_DIRECTORY.md",
      "line": 3,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "Build Fix 47 converts `/templates` from a single filter-heavy grid into an intent-first academic template directory inspired by the strongest navigation ideas in contemporary LaTeX template libraries while retaining TeXise's richer provenance, compiler, institution and Free/Pro metadata."
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX47_NAVIGABLE_TEMPLATE_DIRECTORY.md",
      "line": 9,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "Every seeded institution template is explicitly TeXise-created, carries a demo attribution, states that no institutional endorsement is implied, and is marked `noIndex`. Demo-only institution collection pages are also served `noindex,follow` and excluded from the sitemap until they contain at least one verified/indexable production template. The seeds exist to exercise navigation before verified production template packages are imported; they are not presented as official university templates."
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX48_TEMPLATE_UX_RELIABILITY.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise R14.28.20 Build Fix 48 — Template UX Reliability"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX48_TEMPLATE_UX_RELIABILITY.md",
      "line": 7,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`/admin/institutions` can upload, replace and remove PNG, JPEG or WebP logos up to 5 MB. Files are validated by bytes, stored beneath the filesystem-first `texise-templates/institution-assets/<institution>/` tree and referenced portably by `institutions.json`. Public discovery cards and institution pages resolve the image through `/api/templates/institutions/:id/logo`. Replacement responses are revalidated instead of being pinned behind an hour-long browser cache. Merging a duplicate institution"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX48_TEMPLATE_UX_RELIABILITY.md",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Template project bytes are fetched and validated before TeXise creates any workspace record or opens the editor. Decoded byte length is authoritative; HTTP `Content-Length` is deliberately ignored because transfer compression can legitimately differ from the manifest's uncompressed byte size. If any project file is unavailable or stale, Apply stops with a clear `No project was created` message. The same preflight contract is used by the public template page and the project Template dialog. File-"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX48_TEMPLATE_UX_RELIABILITY.md",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "TeXise no longer automatically calls `navigator.storage.persist()` on Firefox/FxiOS, avoiding the prominent storage-permission prompt that can alarm users. Existing persistence status can still be read. Firefox continues to use normal IndexedDB/OPFS quota behavior and TeXise's project export/backup mechanisms. The same suppression applies to browser project creation, local AI and Paper Memory paths."
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX49_PAGINATION_TYPECHECK_FIX.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise R14.28.20 Build Fix 49 — Pagination Typecheck Correction"
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX50_PUBLIC_SITE_REDESIGN.md",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "The homepage now renders, in order: Hero, the existing interactive product/editor preview, short differentiators, six Power Features, TeXise vs Overleaf, shared Pricing, FAQ and the compact final CTA. The previous long workflow/editor/local-first/reproducibility/research-AI/lifecycle/capability marketing blocks are no longer rendered."
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX50_PUBLIC_SITE_REDESIGN.md",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The public monthly checkout has a separate optional `TEXISE_PRO_MONTHLY_SHOP` configuration. Lifetime continues to use the existing `TEXISE_SHOP` path. A missing monthly checkout never redirects to the Lifetime product accidentally."
    },
    {
      "path": "docs/HOTFIX10_BUILDFIX50_PUBLIC_SITE_REDESIGN.md",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Clean PDF export is represented by the `export.pdf.clean` capability. Pro downloads the original compiled bytes. Free download renders the already-compiled document with PDF.js, overlays `TeXise · Free`, and emits a separate raster PDF. This never edits the canonical `.tex` source, compile input, live PDF preview or SyncTeX data."
    },
    {
      "path": "docs/HOTFIX10_SEO_SECOND_AUDIT.md",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "8. **Social metadata:** the supplied 1200x630 TeXise image remains the generic fallback; article covers and template preview imagery take precedence where available. `twitter:site` and Organization social identity are explicit."
    },
    {
      "path": "docs/HOTFIX10_SEO_SECOND_AUDIT.md",
      "line": 20,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TeXise should prefer a small number of substantial first-hand guides, technical workflows, verified template pages and research tools over mass-generated query-variation pages. Institution pages must not imply endorsement, and `official` template status must come from explicit provenance rather than inference."
    },
    {
      "path": "docs/HOTFIX10_SEO_SECOND_AUDIT.md",
      "line": 30,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Treat deployment as an SEO migration: capture known legacy template URLs, populate `texise-templates/redirects.json` for slug changes, deploy redirects and destination pages together, regenerate the sitemap/template manifest, inspect representative old/new URLs, then monitor indexing after deployment."
    },
    {
      "path": "docs/HOTFIX10_TEMPLATE_ADMIN_ARCHITECTURE.md",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "Reusable records live in `texise-templates/institutions.json`. Admin can create/edit/merge institutions and map templates to stable institution IDs, avoiding duplicate spellings such as `UNSW`, `UNSW Sydney` and `University of New South Wales` becoming separate taxonomy entities."
    },
    {
      "path": "docs/HOTFIX10_TEMPLATE_MIGRATION_AUDIT.md",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `texise-templates/free/<slug>/`"
    },
    {
      "path": "docs/HOTFIX10_TEMPLATE_MIGRATION_AUDIT.md",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `texise-templates/pro/<slug>/`"
    },
    {
      "path": "docs/HOTFIX10_TEMPLATE_MIGRATION_AUDIT.md",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Renamed slugs: persist explicit old->new mappings in `texise-templates/redirects.json`."
    },
    {
      "path": "docs/HOTFIX10_TEST_CERTIFICATION.md",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Product: TeXise"
    },
    {
      "path": "docs/HOTFIX10_TEST_CERTIFICATION.md",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "BF47 preserves the BF46 preview/homepage foundation and seeds 28 explicitly labelled TeXise-created demonstration templates so the redesigned directory can be exercised against realistic breadth rather than the original eight-record catalog. The generated catalog contains **36 published templates across 10 institutions**, with **21 Free / 15 Pro** templates, 13 document categories, institution aliases, country/degree metadata and mixed image/PDF preview modes. All 28 synthetic demo detail pages "
    },
    {
      "path": "docs/HOTFIX10_TEST_CERTIFICATION.md",
      "line": 42,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The BF43 production deployment supplied authoritative dependency-backed evidence that pinned dependency installation, custom validation, strict `tsgo`, Biome lint, BusyTeX provisioning, the 357-check static contract audit and the Vite production browser build all pass. The deployment then failed only after trusted-runtime activation because the staged `server/` snapshot imported `../scripts/generate-template-manifest.mjs`, a file that is intentionally absent from `texise-data/runtime/current`. B"
    },
    {
      "path": "docs/HOTFIX10_TEST_CERTIFICATION.md",
      "line": 67,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "| TeXise branding/provenance audit | PASS |"
    },
    {
      "path": "docs/HOTFIX10_TEST_CERTIFICATION.md",
      "line": 77,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The Hotfix10 guards verify that raw `texise-templates/free` and `texise-templates/pro` trees are not intended as public static download surfaces, generated manifests do not expose raw source paths, and Pro project-file delivery is mediated through server-side entitlement checks with private/no-store caching. ZIP upload validation rejects unsafe traversal/symlink/executable-like archive entries and applies unpacked-size/file-count protections before promotion into the canonical template filesyste"
    },
    {
      "path": "docs/HOTFIX10_TEST_CERTIFICATION.md",
      "line": 87,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "1. **Historical template corpus:** BF47 contains the eight baseline template packages plus 28 deliberately synthetic TeXise demonstration templates used to exercise the directory. These demos are not substitutes for the materially larger historical production template corpus identified in the earlier public-index audit. Recover/import verified historical packages before retiring any still-indexed legacy URLs that lack real replacements."
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 4,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "Source baseline: `texise-saas-r14.28.20-buildfix49-hotfix10-protected-source-navigation-admin-cloud-complete(1).zip`"
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 48,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- The supplied A4 WebP is installed once as `/texise-template-default-thumbnail.webp` and is used for catalog cards only when no admin thumbnail is configured."
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 58,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `packages/js-lib/latex-visual/src/native-texise-editor.ts`"
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 62,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `packages/tooling/browser-entry/public/texise-template-default-thumbnail.webp`"
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 81,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `node scripts/texise-release-audit.mjs`: **362/362 PASS**."
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 82,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `node scripts/texise-saas-static-audit.mjs`: **44/44 PASS**."
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 125,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `node scripts/texise-release-audit.mjs`: **362/362 PASS**."
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 126,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `node scripts/texise-saas-static-audit.mjs`: **44/44 PASS**."
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 139,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `node scripts/texise-release-audit.mjs`: 362/362 PASS."
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 154,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `/templates` cards now opt out of CSS Grid stretching with `align-self:start;height:fit-content`; both All Templates and Fresh Starting Points grids align items to `start`, so each card finishes at `.texise-template-card-body` instead of gaining blank height to match a taller neighbor."
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 160,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `node scripts/texise-release-audit.mjs`: **362/362 PASS**."
    },
    {
      "path": "docs/HOTFIX10_VISUAL_FIDELITY_TEMPLATE_THUMBNAILS_IMPLEMENTATION_STATE.md",
      "line": 161,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `node scripts/texise-saas-static-audit.mjs`: **44/44 PASS**."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 1,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "# Hotfix9 / Build Fix 40 TeXise Branding & Provenance Audit"
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "TeXise is the product identity. Users, search engines, social crawlers, PWA/desktop/mobile metadata and ordinary runtime diagnostics should encounter **TeXise/texise**, not inherited names from projects whose code or ideas contributed to the implementation."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 7,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "At the same time, TeXise must not falsify dependency ownership or remove legally/technically necessary provenance. A third-party package name, required download endpoint, migration key or required attribution remains unchanged when changing it would break software, data compatibility or attribution obligations."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "## Completed TeXise-owned identity migration"
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Local workspace packages were moved from inherited `@bangle.io/*` naming to `@learnitive/*` where the package is TeXise-owned."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- TeXise-owned environment/config identifiers use `TEXISE_*`."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- TeXise-owned CSS variables, DOM/test identifiers, editor symbols, global names and protocol names use TeXise naming."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Desktop identity uses TeXise product names, `texise://app/`, `com.texise.desktop`/nightly identity and TeXise updater configuration."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Mobile identity uses TeXise schemes/package identifiers and the canonical TeXise web fallback."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 19,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- Product-facing TeXlyre-derived collaboration/editor component names were renamed to TeXise equivalents while narrow source-level adaptation comments were retained where they aid provenance/maintenance."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 20,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- TeXise-owned documentation for current desktop/service/release behavior was updated so it does not describe the current product as an upstream project."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 25,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The primary browser database is now `texise-db`."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "The historical database name `bangle-io-db` is intentionally retained **only** in the migration layer. On startup, if the new TeXise database is empty, TeXise checks the historical database and copies known records into the TeXise stores. The migration is non-destructive: failures leave the old database untouched rather than risking local project loss."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 41,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "| `texlive2026.texlyre.org` | Required current TeX Live asset endpoint until TeXise hosts an equivalent distribution | Compiler network endpoint |"
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "No exception allows an upstream identity to become a TeXise page title, site name, publisher, application name, Open Graph identity, Twitter identity, PWA name, current user-facing UI label or current product description."
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 50,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`scripts/verify-texise-branding.mjs` scans production-facing source/configuration for:"
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 78,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- current product/operations docs: TeXise identity;"
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 79,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- current public/runtime/SEO surfaces: TeXise identity, zero exceptions;"
    },
    {
      "path": "docs/HOTFIX9_BRANDING_PROVENANCE_AUDIT.md",
      "line": 100,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- TeXise owns/hosts an equivalent compiler artifact/distribution path and provisioning has been migrated and tested; and/or"
    },
    {
      "path": "docs/HOTFIX9_SEO_AUDIT.md",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Make TeXise a technically excellent search/social surface for **online LaTeX editing for scientific research writing** while keeping the product's local-first, privacy-focused identity accurate. The implementation must work for crawlers before the React application hydrates, use TeXise-owned social media for generic pages, use each blog article's cover media for article sharing, and avoid indexing private application routes or low-value faceted result URLs."
    },
    {
      "path": "docs/HOTFIX9_SEO_AUDIT.md",
      "line": 23,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "> Online LaTeX Editor for Scientific Research Writing | TeXise"
    },
    {
      "path": "docs/HOTFIX9_SEO_AUDIT.md",
      "line": 50,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `/og/texise-social.jpg`"
    },
    {
      "path": "docs/HOTFIX9_SEO_AUDIT.md",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "The generic image is derived from the user-provided TeXise artwork and is TeXise-branded only."
    },
    {
      "path": "docs/HOTFIX9_SEO_AUDIT.md",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Published blog article pages override the generic image with the CMS **cover image**. If the CMS knows width/height, the server emits the real dimensions. If it does not, TeXise deliberately omits dimensions rather than inventing them."
    },
    {
      "path": "docs/HOTFIX9_SEO_AUDIT.md",
      "line": 67,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Social URLs always share the canonical `https://www.texise.com/blog/{slug}` URL."
    },
    {
      "path": "docs/HOTFIX9_SEO_AUDIT.md",
      "line": 77,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- `robots.txt` allows the public site but disallows private/app/internal paths, including `/__texise`."
    },
    {
      "path": "docs/HOTFIX9_SEO_AUDIT.md",
      "line": 86,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "The product/search landscape suggests that metadata quality alone is not enough. TeXise should continue building **indexable, useful search surfaces** around the jobs researchers actually perform. The following are the highest-value content/product SEO opportunities identified from comparison with major LaTeX and scientific-writing products:"
    },
    {
      "path": "docs/HOTFIX9_SEO_AUDIT.md",
      "line": 106,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Generic OG image is exactly 1200x630 and TeXise-branded."
    },
    {
      "path": "docs/LIVE_PDF_R6_INSTANT_RENDERING.md",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Make eligible LaTeX prose edits appear in the PDF pane immediately, using the TeXpile live-preview architecture as a reference, without replacing or weakening TeXise's existing exact Live PDF (R5), manual Compile, SyncTeX, PDF export, collaboration, AI, Visual editor, storage or cloud fallback behavior."
    },
    {
      "path": "docs/LIVE_PDF_R6_INSTANT_RENDERING.md",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "2. TeXise opportunistically pre-warms a **separate** BusyTeX/LuaLaTeX worker for R6."
    },
    {
      "path": "docs/LIVE_PDF_R6_INSTANT_RENDERING.md",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "TeXpile Desktop can keep a native LuaLaTeX process alive and drive it through a daemon/stdin protocol. TeXise runs in a browser, and the current BusyTeX public browser API does not expose that persistent stdin-driven TeX process."
    },
    {
      "path": "docs/LIVE_PDF_R6_INSTANT_RENDERING.md",
      "line": 60,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- R6 source wrappers are transient `__texise_live_instant__*.tex` files passed only to the in-memory compiler; no user file is modified or persisted."
    },
    {
      "path": "docs/LIVE_PDF_R6_INSTANT_RENDERING.md",
      "line": 86,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- R6 invariants are also included in `scripts/release-runtime-hardening.test.mjs`, `scripts/texise-release-audit.mjs`, and the BF50 source guard."
    },
    {
      "path": "docs/NEXT_CHAT_CONTINUATION_PROMPT_HOTFIX30.md",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Do not modify production `learnitive.com` / `www.learnitive.com`, `texise.com` / `www.texise.com`, `/etc/texise/*`, TeXise vhosts, or TeXise services."
    },
    {
      "path": "docs/NEXT_CHAT_CONTINUATION_PROMPT_HOTFIX30.md",
      "line": 114,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "9. If another defect appears, diagnose the complete failure class, patch it, add regression coverage, rerun supported tests/audits, and package a new non-overwriting hotfix ZIP with SHA-256. Do not patch production or TeXise."
    },
    {
      "path": "docs/NEXT_CHAT_CONTINUATION_PROMPT_HOTFIX31.md",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Do not modify production `learnitive.com` / `www.learnitive.com`, `texise.com` / `www.texise.com`, `/etc/texise/*`, TeXise vhosts or TeXise services."
    },
    {
      "path": "docs/NEXT_CHAT_CONTINUATION_PROMPT_HOTFIX32.md",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Do not modify production `learnitive.com` / `www.learnitive.com`, `texise.com` / `www.texise.com`, `/etc/texise/*`, TeXise vhosts or TeXise services."
    },
    {
      "path": "docs/NEXT_CHAT_CONTINUATION_PROMPT_HOTFIX33.md",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Do not modify production `learnitive.com` / `www.learnitive.com`, `texise.com` / `www.texise.com`, `/etc/texise/*`, TeXise vhosts or TeXise services."
    },
    {
      "path": "docs/NEXT_CHAT_CONTINUATION_PROMPT_R5.md",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- No user-controlled command executes on the host; never mount Docker socket; do not expose /etc/learnitive or TeXise infrastructure."
    },
    {
      "path": "docs/NEXT_CHAT_CONTINUATION_PROMPT_R5.md",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "5. Add guarded canonical CMS/documentation migration for old anonymous-collaboration, Send Project, old entitlement and TeXise-facing copy without overwriting admin-customized text."
    },
    {
      "path": "docs/TEXISE_FULL_PRODUCT_AUDIT_R14_28_14_BF14.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise full product audit — R14.28.14 Build Fix 14"
    },
    {
      "path": "docs/TEXISE_FULL_PRODUCT_AUDIT_R14_28_14_BF14.md",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "TeXise now has a coherent local-first manuscript workflow spanning Source/Visual editing, browser compilation, PDF/SyncTeX, Paper Memory, research assistance, comments/Track Changes, optional account metadata, Pro Cloud Compile and a separately isolated Linux Terminal. Build Fix 14 closes three conspicuous product gaps: visual TikZ creation, Google-Docs-style collaborator presence across both manuscript editors, and a first-party Learn LaTeX surface."
    },
    {
      "path": "docs/TEXISE_FULL_PRODUCT_AUDIT_R14_28_14_BF14.md",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Large native TeXise modal; no iframe and no external diagram service."
    },
    {
      "path": "docs/TEXISE_FULL_PRODUCT_AUDIT_R14_28_14_BF14.md",
      "line": 53,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The section is integrated into navigation, footer, public search, metadata and sitemap. Completion state is stored only in browser `localStorage` (`texise:learn:completed:v1`) and does not require login."
    },
    {
      "path": "docs/TEXISE_FULL_PRODUCT_AUDIT_R14_28_14_BF14.md",
      "line": 111,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Several historical Bangle-era modules remain very large. The audit also found old TODO comments in `baby-fs` and legacy editor helper code. None are on the current TeXise release-critical path, but future refactoring should reduce large-file coupling and either retire or document unused Bangle-era abstractions."
    },
    {
      "path": "docs/TEXISE_FULL_PRODUCT_AUDIT_R14_28_14_BF14.md",
      "line": 131,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- no TeXise font binaries in source release ZIPs;"
    },
    {
      "path": "docs/TEXISE_FULL_PRODUCT_AUDIT_R14_28_14_BF14.md",
      "line": 132,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `/texise-data` and trusted service namespaces remain denied by Apache."
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 1,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "# TeXise R14.28.14 service audit"
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "This audit records the disposition of the production services around the consolidated `www.texise.com` deployment. Uploaded daemon source was inspected where available. Migration remains non-destructive: old units/source trees are preserved as rollback material even when a service is no longer active."
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "## `texise-console-gateway.service` — ACTIVE: Linux Terminal · Pro"
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The supplied Console Gateway source was incorporated under `texise-services/console-gateway/` and hardened as a first-class Pro service. It is no longer a retirement candidate."
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The trusted `texise.service` owns account authentication and server-authoritative Pro entitlement. Browsers create sessions and transfer/list/download files only through `/api/terminal/...`; the private gateway secret never reaches browser JavaScript. The API issues a short-lived websocket credential and the browser supplies it through `Sec-WebSocket-Protocol`, not the request URL, so Apache access logs do not receive a bearer token. Gateway tokens are one-time and session-bound."
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Each session launches an isolated Docker terminal from the dedicated `TEXISE_CONSOLE_IMAGE`, defaulting to `texlive/texlive-console:pro`. The container runs non-root, drops all capabilities, applies CPU/memory/PID limits and `no-new-privileges`, receives only its session workspace, and never receives the Docker socket or `/etc/texise`. `host` networking is refused. Normal Docker bridge egress is retained for GitHub/Python/scientific workflows; host/internal service exposure must remain protected"
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 17,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The systemd service runs as dedicated `texise-console` with Docker supplemental-group access. It is installed/enabled/restarted and production-certified during deployment."
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "## `texise-latex-compile.service` — ACTIVE: Cloud Compile · Pro"
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The supplied compiler source is shipped under `texise-services/cloud-compile/` and uses the independent `TEXISE_CLOUD_COMPILE_IMAGE`, defaulting to `texlive/texlive:latest`. Its runtime policy is intentionally stricter: non-interactive Docker execution, `--network none`, no shell escape, read-only input, isolated output, dropped capabilities, non-root container UID, CPU/memory/PID/time/input/output/concurrency limits, cancellation and abandoned-job cleanup."
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The trusted API exposes `/api/compile/cloud` only after server-authoritative Pro entitlement/quota checks. Worker traffic stays loopback and is authenticated with a private shared secret. The service now runs as dedicated `texise-compile`; Apache/PHP `www-data` is not granted Docker authority."
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "## `texise-collab.service` — LEGACY ROLLBACK"
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The supplied `node-collab-server` is a Hocuspocus/Yjs daemon whose persistence/auth flow calls the historical Laravel `/api/v1` backend. Current TeXise collaboration instead uses browser Yjs with the same-origin `/collab-live` transient document/awareness relay from `texise.service`; `/collab-signal` is compatibility-only for older y-webrtc clients. No current browser consumer of `/collab-ws` remains."
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 31,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "## `texise-reverb.service` — LEGACY ROLLBACK"
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 41,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `texise.service` — trusted API, accounts/CMS/licensing/AI and current collaboration signaling."
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 42,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `texise-latex-compile.service` — private Docker-isolated Cloud Compile · Pro worker."
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 43,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `texise-console-gateway.service` — authenticated Docker-isolated Linux Terminal · Pro gateway."
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `texise-collab.service`"
    },
    {
      "path": "docs/TEXISE_LEGACY_SERVICE_AUDIT_R14_28_14.md",
      "line": 48,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `texise-reverb.service`"
    },
    {
      "path": "docs/TEXISE_SAAS_CHANGED_FILES.md",
      "line": 4,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `packages/core/app/src/components/public-home/home-hero.tsx` — removes the decorative `texise-home-hero-glow` element."
    },
    {
      "path": "docs/TEXISE_SAAS_CHANGED_FILES.md",
      "line": 5,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `packages/core/app/src/pages/page-editor.tsx` — adds the stable `texise-editor-toolbar` class to the real editor toolbar."
    },
    {
      "path": "docs/TEXISE_SAAS_CHANGED_FILES.md",
      "line": 7,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `packages/tooling/browser-entry/src/ws-texise.css` — mobile-only native horizontal toolbar scrolling."
    },
    {
      "path": "docs/TEXISE_SAAS_CHANGED_FILES.md",
      "line": 10,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `scripts/texise-release-audit.mjs` — BF39.2 release gate."
    },
    {
      "path": "docs/TEXISE_SAAS_CHANGED_FILES.md",
      "line": 11,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `scripts/texise-saas-static-audit.mjs` — updated homepage simulation audit."
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise SaaS — MySQL, Administrator and Trusted API Setup"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 3,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "## What `texise.service` is"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 5,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "`texise.service` is the loopback-only trusted backend used by Apache for `/api/*` and by TeXise for accounts/sessions, Google OAuth callbacks, project metadata, licenses and AI quota, CMS/support, scholarly-provider gateways, AI Review server fallback and collaboration signaling. It is **not** the LaTeX compiler. Manuscript files and compilation remain browser-local."
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 9,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "## Existing production database: `texise_db`"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 11,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "Provision the database with a dedicated least-privilege application account. The examples below use `texise_app`. Generate a password containing only hex characters so it is safe to place in the systemd EnvironmentFile:"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 21,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "CREATE DATABASE IF NOT EXISTS texise_db"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 25,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "CREATE USER IF NOT EXISTS 'texise_app'@'localhost' IDENTIFIED BY 'REPLACE_WITH_DB_PASS';"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "CREATE USER IF NOT EXISTS 'texise_app'@'127.0.0.1' IDENTIFIED BY 'REPLACE_WITH_DB_PASS';"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 27,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "ALTER USER 'texise_app'@'localhost' IDENTIFIED BY 'REPLACE_WITH_DB_PASS';"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 28,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "ALTER USER 'texise_app'@'127.0.0.1' IDENTIFIED BY 'REPLACE_WITH_DB_PASS';"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 31,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "ON texise_db.* TO 'texise_app'@'localhost';"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "ON texise_db.* TO 'texise_app'@'127.0.0.1';"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 37,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TeXise does not require `DROP`, global `CREATE DATABASE`, or MySQL root privileges during normal operation. Leave `TEXISE_MYSQL_CREATE_DATABASE=0` when `texise_db` already exists."
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Verify the application account before running the TeXise upgrade:"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 42,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "mysql -h 127.0.0.1 -P 3306 -u texise_app -p -D texise_db -e 'SELECT 1 AS ok;'"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 45,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "## `/etc/texise/texise.env`"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 50,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SAAS_ENABLED=1"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "MYSQL_DATABASE=texise_db"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "MYSQL_USER=texise_app"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 56,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_MYSQL_CREATE_DATABASE=0"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 58,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SESSION_DAYS=30"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "There is no manual SQL insert for the first admin. During the SaaS preflight TeXise runs idempotent migrations and then ensures this account exists:"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 73,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- email: `admin@texise.com`"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 79,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Open `/admin/login`, sign in once with `admin@texise.com` / `admin`, then TeXise requires a replacement password of at least 12 characters."
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 81,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "If `admin@texise.com` already exists as a normal user, TeXise refuses to silently elevate that row and the preflight fails with `BOOTSTRAP_ADMIN_EMAIL_CONFLICT`."
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 85,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The installer places `/usr/local/bin/texise-saas`:"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 88,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-saas preflight"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 89,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-saas status"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 90,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-saas logs"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 93,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "`preflight` uses the same `/etc/texise/texise.env` as the service, connects to the configured database, applies idempotent migrations and verifies the bootstrap administrator. It can therefore diagnose the account layer even if port 3100 is currently unavailable."
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 101,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "3. run MySQL/migration/admin preflight as `texise:texise` with the real systemd environment file;"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 104,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "6. restart `texise.service`;"
    },
    {
      "path": "docs/TEXISE_SAAS_DB_ADMIN_SETUP.md",
      "line": 106,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "8. on a health failure automatically print the latest `texise.service` journal."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise SaaS environment and deployment configuration"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "TeXise remains local-first. These settings configure the trusted account/CMS/support/licensing service plus optional Pro execution services. Project files, PDFs, Paper Memory data, filesystem handles, local AI models, BYOK vendor keys, datasets and Git credentials are never SaaS database fields. Cloud Compile and Linux Terminal receive files only for an explicit server execution request."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "The production installer reads `/etc/texise/texise.env` and preserves existing administrator values on upgrade. `deploy/config/texise.env.example` is the canonical example."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_PUBLIC_URL=https://www.texise.com"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SHOP=https://your-lifetime-shop-destination.example/"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_PRO_MONTHLY_SHOP=https://your-monthly-pro-shop-destination.example/"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SAAS_ENABLED=1"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SESSION_DAYS=30"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`TEXISE_PUBLIC_URL` is the canonical public origin. `TEXISE_SHOP` and `TEXISE_PRO_MONTHLY_SHOP` are the safe checkout destinations exposed by the public configuration API. `SESSION_SECRET` never reaches browser JavaScript. For Payhip licence verification, keep `PAYHIP_PRODUCT_SECRET_KEY` server-side and optionally set `PAYHIP_PRODUCT_LINK` to Payhip's short product token; it is separate from the public `TEXISE_SHOP` URL."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`TEXISE_SAAS_ENABLED=1` is the clearest production activation flag. For upgrade safety, the default `MYSQL_DATABASE=texise_db` alone does **not** activate SaaS."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "MYSQL_DATABASE=texise_db"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "MYSQL_USER=texise"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 30,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_MYSQL_CREATE_DATABASE=0"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 33,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The normal least-privilege deployment uses an already-created database and `TEXISE_MYSQL_CREATE_DATABASE=0`. Set `TEXISE_MYSQL_CREATE_DATABASE=1` only when the configured MySQL account is intentionally allowed to run `CREATE DATABASE IF NOT EXISTS` during bootstrap."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "${TEXISE_PUBLIC_URL}/api/auth/google/callback"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 50,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "The secret remains server-side. The browser receives only the Google authorization redirect. TeXise uses authorization-code flow with state and PKCE and maps users by Google's stable `sub` identifier."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "SMTP_FROM=support@texise.com"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 69,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Existing TeXise compiler/license/scholarly/AI-review settings remain supported. The installer must preserve `/etc/texise/texise.env`, `/etc/texise/config.json`, entitlement keys, license keys and other existing deployment secrets."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 78,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- the safe public `TEXISE_SHOP` destination."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 86,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_SAAS_ENABLED=1`;"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 88,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_MYSQL_CREATE_DATABASE=1`."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 90,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "`MYSQL_DATABASE=texise_db` by itself is intentionally ignored as an activation signal. This protects editor-only installations that receive the default database key during an upgrade."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 112,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "The production default database is `texise_db`. Custom existing database names remain supported; the installer migrates only the historical TeXise-owned default `texisecom_db` to `texise_db` and preserves administrator-customized names. Provision the database separately with a least-privilege application account, then run `texise-saas preflight`. The preflight executes idempotent migrations and creates `admin@texise.com` only when it is absent. The initial bootstrap password is `admin` and `/adm"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 114,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Recommended application privileges on the configured database are `SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER, INDEX, REFERENCES`. `DROP` and global database-creation privilege are not required for normal operation. Leave `TEXISE_MYSQL_CREATE_DATABASE=0` when the database is provisioned by an administrator."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 116,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Operational helpers installed by TeXise:"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 119,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-saas preflight"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 120,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-saas status"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 121,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-saas logs"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 124,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise.service` is the loopback-only trusted API for accounts/sessions, licensing/quota, CMS/support, scholarly gateways, AI Review fallback, collaboration signaling and server-authoritative Pro execution brokerage. Local Compile remains browser-local; optional Cloud Compile and Linux Terminal are delegated to their private Docker services."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 132,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_IMAGE=texlive/texlive:latest"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 133,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_IMAGE=texlive/texlive-console:pro"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 135,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "The canonical `texlive/texlive-console:pro` tag is built locally by TeXise from `deploy/docker/console/`; it is not expected to exist on Docker Hub. Only non-default operator-supplied Console image names are pulled as external images."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 138,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "The images are intentionally separate. Cloud Compile starts `texlive/texlive:latest` non-interactively with networking disabled and shell escape disabled. Linux Terminal starts the TeXise-local `texlive/texlive-console:pro` image interactively with controlled outbound Docker networking for GitHub and scientific workflows. Either image can be pinned to an immutable digest after certification."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 143,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_ENABLED=0"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 144,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_WORKER_URL=http://127.0.0.1:3001"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 145,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_WORKER_SECRET=<generated-private-secret>"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 146,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_ALLOWED_ENGINES=pdflatex,xelatex,lualatex"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 149,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise.service` is the only browser-facing broker. The worker remains loopback-only. Enabling Cloud Compile causes deployment certification to compile test projects with every advertised engine and a bibliography probe before activation succeeds."
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 154,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_LINUX_TERMINAL_ENABLED=1"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 155,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_GATEWAY_URL=http://127.0.0.1:8787"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 156,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_GATEWAY_SECRET=<generated-private-secret>"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 157,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_MAX_UPLOAD_BYTES=50000000"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 158,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_MAX_DOWNLOAD_BYTES=100000000"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 159,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_SESSION_MINUTES=240"
    },
    {
      "path": "docs/TEXISE_SAAS_ENVIRONMENT.md",
      "line": 162,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Linux Terminal requires `TEXISE_SAAS_ENABLED=1` because ownership and Pro entitlement are server-authoritative account properties. The browser never receives `TEXISE_CONSOLE_GATEWAY_SECRET`; it receives a one-time short-lived websocket credential after `/api/terminal/sessions` succeeds. Project transfer is explicit and session files are temporary."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Template platform:** the authoritative source remains `texise-templates/free/` and `texise-templates/pro/`. Admin now supports safe single/bulk ZIP upload, filesystem-backed metadata editing, Free/Pro moves, structural project validation, reusable academic-institution records, bulk classification and explicit Assets Sync. Manual `cp`/SCP into either tier followed by Assets Sync remains supported without database registration."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 37,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "**Branding:** current product surfaces use TeXise Editor and TeXise Terminal where appropriate. Genuine `@texiser` social identity, third-party packages, compiler endpoints, migration compatibility keys and legally/technically necessary provenance remain intact."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 50,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**State:** implemented and source-certified. BF39 now uses restrained TeXise typography, a taller TeXise editor simulation, local Source/Visual state switching, a fake compile/PDF-refresh sequence, and a highlighted simulated Terminal. No actual editor/compiler/network/terminal runtime is initialized by the homepage."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Objective:** simplify the public first screen and make the product itself the dominant visual, using the supplied Thetapad composition only as structural inspiration while retaining an original TeXise design and factual product claims."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Implemented:** a new `HomeHero` component owns the two-line hero heading, detailed static TeXise workspace preview, exact local-first paragraph and three circular-check capabilities. The preview models Files, Source/Visual/Navigator, Compile, PDF, Terminal, TexLab, AI and Review using presentation-only React/CSS. Responsive rules progressively hide Files and PDF as width decreases; `100svh` sizing targets the first screen; reduced-motion removes entrance motion. The existing lower home section"
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Brand/social:** TeXise yellow and the BF38 favicon are used throughout the hero. The floating X CTA now displays `@TeXiser` while its URL stays lowercase and unchanged."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 72,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# TeXise SaaS Implementation Ledger"
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 96,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Brand:** installs the supplied horizontal `/texise-logo.png` for desktop/tablet and square `/texise-logo-mobile.png` for compact/mobile views. The Brand component uses `<picture>` at the existing 48rem breakpoint. Old generated `texise-brand-mark` / `texise-brand-word` content is removed from active UI/CSS."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 148,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Administrator security:** fresh startup no longer creates a known administrator password. `texise-saas admin-create` is the explicit operator provisioning/reset path. Startup detects only the exact historical `admin/admin` bcrypt credential, revokes it and its sessions, and otherwise leaves an existing secure administrator unchanged. Administrator throttling is persisted in MySQL by IP/account scope and stale sessions/throttle buckets are cleaned periodically."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 154,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Snapshot/rejoin safety:** project structure is sealed at Host readiness with a snapshot manifest. Existing supported Y.Text files remain collaboratively mutable; normal collaboration APIs cannot create new files or rewrite structural metadata after sealing. Before same-room rematerialisation, TeXise compares local files against the last collaboration snapshot baseline and copies extra/same-path-divergent content to `.texise-local-recovery/<timestamp>/...` before applying the current shared sna"
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 158,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Security maintenance:** direct `ws` floor is 8.21.3; Nodemailer is 9.0.5. Production CSP retains required HTTPS provider access but restricts WebSocket connectivity to the canonical TeXise origin. README/current docs state that a collaboration Project link is a bearer trusted-editor capability and that Host lifecycle state is not cryptographic authorization."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 162,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Operator upgrade action:** if startup reports that the historical default administrator credential was revoked, run `sudo texise-saas admin-create` interactively before attempting administrator login. Instances whose administrator already had a non-default secure password require no password reset."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 168,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Objective:** collapse live collaboration onto the TeXise Source core already present in the product: direct CodeMirror ↔ `y-codemirror.next` ↔ `Y.Text`, upstream `y-websocket`, `y-indexeddb`, one Awareness cursor representation, and no competing Visual/authorship/review/file-tree collaboration engine."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 178,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Objective:** make TeXise collaboration remain stable under sustained concurrent editing and approach Google Docs cursor/selection behavior in both Source and Visual modes, while fixing the overflowing collaborator modal."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 224,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Source presence:** CodeMirror's existing `.cm-ySelectionInfo` awareness label is now always visible above the remote caret, with the collaborator's Yjs-assigned color and a compact TeXise UI-font name label. No fork of `y-codemirror.next` is introduced."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 233,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `LEGACY_MIGRATION_KEY` is browser-local migration bookkeeping only; it imports the old TeXise collaboration IndexedDB snapshot at most once per BF25/BF26 room persistence database."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 241,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**Root cause:** BF24 treated Yjs server sync as proof of a successful join and still used a TeXise-written browser provider. A password mismatch (or any room-identity divergence) could therefore create two valid empty rooms; each client completed Sync Step 2 and reported `live` without ever seeing the intended peer."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 254,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Installer/deployment hooks and PWA shell generation advance to Build Fix 24 / `texise-app-shell-r14-28-14-buildfix24-v1`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 262,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Rotated the PWA shell generation to `texise-app-shell-r14-28-14-buildfix23-v1`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 270,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Rotated the PWA shell generation to `texise-app-shell-r14-28-14-buildfix22-v1`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 278,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- Replaced delayed absolute-offset `texiseAuthor` formatting with relative-position provenance in a collaborative Yjs map, including migration/cleanup of legacy marks and Source/Visual attribution projection outside `.tex`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 281,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Centralized account effective entitlement: `role=admin` is Pro before licence lookup, so the bootstrap `admin@texise.com` account and future administrator-role accounts receive every existing Pro capability without a licence."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 284,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advanced PWA shell generation to `texise-app-shell-r14-28-14-buildfix21-v1`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 300,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Replaced TikZ Draw dark tool tiles with white/yellow TeXise controls and black icons/text; active/primary = `#DA0B4E`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 302,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Advanced PWA shell generation to `texise-app-shell-r14-28-14-buildfix20-v1`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 351,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Build Fix 11: `texlive/texlive-console:pro` is now a TeXise-local image built from `deploy/docker/console/` instead of pulled from Docker Hub; Cloud Compile remains `texlive/texlive:latest`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 358,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Trusted API and Cloud Compile were already healthy in the failing deployment; no API-port or `app.texise.com` routing change is involved in this fix."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 361,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Authoritative rollback baseline: `texise-saas-r14.28.13-publichtml-runtime-blog-media-article-final.zip`, SHA-256 `bffb8140b309c59373a5c7d8384c54e7aebb539ad010d8c69699eafc9514e1de`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 366,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- This specifically fixes production installs invoked from `/var/www/texise.com`, where cwd-relative resolution previously omitted the canonical `public_html` segment."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 372,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- `texise-data` and its shared `tmp` parent use execute-only traversal for non-`texise` execution users while Cloud Compile/Console child workspaces remain private and individually owned."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 377,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Canonical public origin: `https://www.texise.com`; canonical source/runtime root: `/var/www/texise.com/public_html`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 378,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Non-destructive migration/rollback handling for the former `app.texise.com` tree, certificates and service source."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 380,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Trusted `texise.service` migration while retaining its hardening."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 381,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Real supplied `texise-latex-compile.service` source integrated as the private Pro Cloud Compile worker, with trusted API brokerage, server-side entitlement/quota enforcement and hardened Docker execution."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 384,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Cloud Compile uses `TEXISE_CLOUD_COMPILE_IMAGE=texlive/texlive:latest`; Linux Terminal Pro uses `TEXISE_CONSOLE_IMAGE=texlive/texlive-console:pro`. Their image lifecycles and runtime policies are independent."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 385,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Home redesign from the supplied TeXise reference, Pricing redesign from the supplied layout reference, and CMS-driven responsive Docs redesign including Local/Cloud Compile documentation."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 399,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- `texise.service` — trusted API plus current collaboration signaling."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 400,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- `texise-latex-compile.service` — private Pro Cloud Compile worker."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 401,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- `texise-console-gateway.service` — authenticated Linux Terminal · Pro gateway."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 404,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- `texise-collab.service`"
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 405,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- `texise-reverb.service`"
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 409,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# TeXise SaaS implementation ledger"
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 411,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Authoritative master prompt: user-provided TeXise SaaS master plan, 2026-08-20."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 412,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Source baseline: `texise-r14.28.12-r31-build-fix-4.4-equation-fidelity-exact-caret-rc-lintfix2-no-review-source-ledger-public_html(1).zip`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 413,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Design/font reference archives were used during implementation; current production styling and assets are TeXise-owned."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 419,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "**External/dependency-backed runtime certification:** pending where explicitly marked `NOT RUNTIME-VERIFIED` in `TEXISE_SAAS_VALIDATION_REPORT.md`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 426,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Canonical public/account/admin pathnames are selected by the same browser entry before the editor app is mounted; TeXise remains one product/service graph."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 433,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Prefix is a visual-system reference only. TeXise does not ship Prefix identity/copy/backend/analytics URLs."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 434,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- ProseMirror remains internal editor machinery. Visible product identity is TeXise."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 455,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "TeXise-owned semantic tokens/components implement these values rather than importing Prefix compiled CSS."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 461,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Audited TeXise editor/router/services, storage, compiler, licensing, AI Review, Paper Memory, templates, trusted server, installer, Apache, tests, Prefix reference and supplied fonts. Corrected the early unsupported progress claims after the user's `?`; all work after that point is filesystem/test-backed."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 489,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Materialized eight existing seed templates under `texise-templates/free/*` and `texise-templates/pro/*`. Added deterministic scanner, tier/path/symlink/size/entry validation, duplicate rejection, explicit binary-safe file list, atomic `.tmp` replacement and build/deploy synchronization."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 497,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Implemented required public routes, original TeXise copy, templates/examples, pricing/shop config, blog/docs CMS, docs navigation/search, metadata-rich public slash search with editor/input exclusions, contact tickets/SMTP, sitemap/robots and route metadata. CMS publication/detail carries author/tags/publication metadata and public detail regenerates sanitized HTML from Markdown."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 505,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Restyled TeXise top bar, primary Compile, account avatar, compact Light/Dark/System theme control, file/sidebar/pane/PDF/AI/Paper Memory/terminal/dialog/mobile chrome through stable selectors without rewriting CodeMirror, ProseMirror, MathLive, compiler or PDF engines. Removed remaining visible inherited identity assets/labels while keeping required internal compatibility identifiers."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 521,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The previous packaged SaaS release was re-audited directly against the complete master plan. The second audit did not change the fundamental architecture; it closed account-preference, project-reconciliation, no-onboarding, CMS metadata/search, admin operational visibility, contact-header and legacy-settings resilience gaps. All source changes are included in the current package and the exact delta is recorded in `TEXISE_SAAS_CHANGED_FILES.md`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 557,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "See `TEXISE_SAAS_ENVIRONMENT.md`. Important additions include `TEXISE_APP_URL`, `TEXISE_SHOP`, MySQL variables, Google OAuth variables, SMTP variables, `SESSION_SECRET`, optional `TEXISE_SAAS_ENABLED`, session days and strict `TEXISE_MYSQL_CREATE_DATABASE` opt-in."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 574,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Full status mapping is in `TEXISE_SAAS_VALIDATION_REPORT.md`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 581,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Returning OAuth overwrote user-edited display name — identity refresh now preserves the TeXise display label."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 588,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Release audits pinned obsolete icon-only Compile presentation — updated to assert compile semantics plus new primary TeXise control."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 613,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Restore the required font assets, install the pinned workspace dependencies, run full build/typecheck/lint/release-quality, then execute the runtime verification sequence in `TEXISE_SAAS_VALIDATION_REPORT.md`. For every failure use the same loop: **Execute → Verify → Diagnose/Fix → Verify → Continue**. Do not restart completed source phases."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 625,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "**COMPLETED:** corrected the two concrete `tsgo` failures reported from `/var/www/app.texise.com/public_html`, and corrected the writable AI Review audit-state location for the hardened systemd service."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 635,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "3. The historical AI Review audit DB default was under `/etc/texise`, but the hardened unit mounts `/etc/texise` read-only. Operational writable state now defaults to `/var/www/app.texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3`; old TeXise-owned default configuration/state migrates during upgrade without changing custom administrator paths."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 637,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "### `/etc/texise` authority"
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 639,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "The observed production layout is valid and is now explicitly preserved by installer logic: `root:texise 0750` directory, `root:texise 0640` for `texise.env`, `config.json`, `license-keys`, private entitlement key and refresh key, and `root:texise 0640` for the public entitlement key. No writable runtime database belongs in `/etc/texise`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 643,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Observed `/etc/texise` contained `entitlement-public.pem` as `root:root 0644` while all other TeXise configuration/signing artifacts were `root:texise 0640`. Although the enclosing directory was already `root:texise 0750`, the installer now normalizes the public key to `root:texise 0640` as well. Existing key contents are preserved; only ownership/mode are normalized. The service's writable AI Review SQLite state remains outside `/etc`, under `/var/www/app.texise.com/public_html/texise-data/audi"
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 645,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "### 2026-08-20 /etc/texise normalization follow-up"
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 647,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The install and upgrade entry points now call `texise_normalize_config_permissions` after key preservation. This makes the expected production state deterministic even when an older installation has mixed modes such as `entitlement-public.pem root:root 0644`. Only the six known TeXise-owned files are normalized; unrelated administrator files are left untouched. The exact legacy-state regression passes."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 649,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "### 2026-08-20 `/etc/texise` post-condition enforcement"
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 651,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "A repeated production listing still showed `entitlement-public.pem root:root 0644`. The normalization helper was already called by both install and upgrade, but there was no explicit post-condition proving the live filesystem had accepted the repair. The installer now calls `texise_verify_config_permissions` immediately after normalization. It verifies the directory is `root:texise 0750` and every present known TeXise config/signing file is `root:texise 0640`; any mismatch aborts with the exact "
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 674,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "A production deployment reached Apache syntax validation and frontend build but `texise.service` exited before binding `127.0.0.1:3100`. Audit confirmed SaaS initialization (MySQL ping, migrations and bootstrap admin) occurred inside `server/index.mjs`, so a wrong database name/credential/grant surfaced only as the later curl health failure. The production database is named `texise_db`, while TeXise's preserved example default may be `texisecom_db` unless explicitly configured."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 676,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Corrective changes: staged-runtime SaaS preflight before activation; `server/saas-preflight.mjs`; startup-safe MySQL diagnostics; automatic service-journal output after health failure; `texise-saas status|preflight|logs`; explicit `texise_db`/least-privilege setup documentation; reserved bootstrap-admin conflict guard. Browser-local compilation architecture is unchanged."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 682,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Observed production state: `/var/www/app.texise.com/fonts` contained the supplied Moranga/STIX binaries, but `dist/texise-fonts` contained only `README.md`. The external wrapper copied fonts into `dist` **before** `install.sh`; Vite then replaced `dist`, deleting the copy. CSS requests `/texise-fonts/Moranga-Regular.otf`, while the supplied Moranga source filename is `Latinotype - Moranga Regular.otf`. Apache SPA fallback therefore returned HTML for the missing font URL; browser OTS reported `in"
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 684,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Fix: installer/upgrade now reads `TEXISE_FONT_SOURCE_DIR` (default `/var/www/app.texise.com/fonts`) after the browser build, canonicalizes the Moranga filename, installs all three fonts into `dist/texise-fonts`, validates sfnt signatures before/after copy, and makes the three browser fonts required production-dist artifacts. The actual supplied `fonts.zip` was exercised through this path successfully."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 686,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Cloudflare Insights remains intentionally blocked by the TeXise CSP because the official browser build is telemetry-free by default; the Cloudflare-injected beacon warning is not a TeXise font/runtime failure."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 712,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Physical/static template assets moved from `templates/` to `texise-templates/` so Apache cannot shadow the `/templates` SPA route."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 713,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Runtime manifest: `/texise-templates/templates.json`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 714,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Static assets: `/texise-templates/free/*` and `/texise-templates/pro/*`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 725,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "External source directory: `/var/www/app.texise.com/fonts/`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 752,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- TeXise SaaS static audits: **43/43 PASS**."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 764,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Active trusted server state is contained under `public_html/texise-data`; public Blog cover media is contained under `public_html/texise-media/blog`; `/etc/texise` remains protected configuration/signing material."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 765,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Historical `/var/lib/texise*` paths are migration-only compatibility inputs, not active runtime locations."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 767,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Deployment preflight validates Blog media write/read as the service user and verifies Apache serves image bytes while denying `/texise-data/*`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 770,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- `/blog/:slug` uses the requested wide article-card design with 2.2:1 hero cover, TeXise notch, Moranga title, Inter prose, JetBrains code, tags/date/author and responsive content."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 775,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- 43/43 TeXise SaaS/product/security audits PASS."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 788,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Shared TeXise brand lockup uses Moranga mark + exact `Tex·ise` regular italic wordmark."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 790,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Home hero follows the supplied Prefix layout reference without copying product content, with TeXise-owned capability cards and Start Writing → `/projects`."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 795,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Blog CMS adds persistent validated cover images at `/var/www/app.texise.com/public_html/texise-media/blog`, Toast UI authoring with telemetry disabled, safe Base64 PNG body images, search/tags/pagination and Prefix-derived listing/article/admin UI."
    },
    {
      "path": "docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md",
      "line": 800,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- 43/43 TeXise SaaS/product/security audits PASS."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 1,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "# TeXise SaaS migration and upgrade notes"
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 43,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "If a legacy table contains duplicate non-empty identity/license values that would make a required unique index unsafe (for example duplicate user emails), migration stops with a clear error. Resolve the duplicate legacy data intentionally, then rerun the idempotent installer. TeXise does not silently merge or delete those rows."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "If `admin@texise.com` does not exist, a bootstrap administrator is created with the requested initial password `admin`, hashed with bcrypt, and `force_password_change=1`."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 83,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise-templates/free/*"
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 84,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise-templates/pro/*"
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 87,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The existing eight template seeds were materialized under those folders. `scripts/generate-template-manifest.mjs` scans and validates them and atomically writes `texise-templates/templates.json` through a `.tmp` file."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 95,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`/projects` is the visible TeXise application home. Bare `/ws` redirects to `/projects`; only hash-bearing deep `/ws#route=...` URLs remain as internal compatibility routing for the mature editor. Canonical SaaS pathname routes are selected before that internal editor router is mounted."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 105,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Prefix source was used as a visual reference only. TeXise-owned semantic tokens reproduce its visual character; Prefix branding, copy, backend logic, URLs, analytics and customer content are not runtime dependencies."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 107,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "ProseMirror remains internal editor machinery. Presentation uses TeXise application chrome while functional ProseMirror selection/cursor/node-view CSS is retained."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 113,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "1. Back up `/etc/texise`, MySQL and the current deployed source/runtime."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 114,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "2. Place the eight required browser font files in `/var/www/texise.com/fonts/` (or `TEXISE_FONT_SOURCE_DIR`) as documented in `FONT-ASSETS-REQUIRED.md`."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 115,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "3. Add MySQL/Google/SMTP/shop settings to `/etc/texise/texise.env` as required; existing values are preserved by installer upgrades."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 116,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "4. Ensure the MySQL database exists, or deliberately opt into database creation with `TEXISE_MYSQL_CREATE_DATABASE=1` and sufficient DB privilege."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 117,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "5. Run the existing TeXise installer/upgrade workflow. Do not create a parallel deployment workflow."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 120,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "8. Configure the exact Google authorized redirect URI `${TEXISE_APP_URL}/api/auth/google/callback` in the Google Cloud project."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 125,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The trusted server is staged before activation and keeps a previous runtime for rollback. Frontend production staging and existing TeXise rollback behavior remain in place. Database migrations are additive/idempotent; do not attempt rollback by dropping new tables in production. Restore from a database backup only if a full data rollback is operationally required."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 129,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Older TeXise configuration may contain:"
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 132,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "TEXISE_AI_REVIEW_AUDIT_DB=/etc/texise/ai-review-audit.sqlite3"
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 135,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "The hardened service intentionally treats `/etc/texise` as read-only. Upgrade now migrates only that historical TeXise-owned default to:"
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 138,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "TEXISE_AI_REVIEW_AUDIT_DB=/var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3"
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 141,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "If the old SQLite database exists, it and any `-wal`/`-shm` files are moved at the final service activation boundary and assigned `texise:texise 0640`. Custom administrator database paths are never rewritten automatically."
    },
    {
      "path": "docs/TEXISE_SAAS_MIGRATION_NOTES.md",
      "line": 146,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Install/upgrade now stages the trusted runtime and its pinned server dependencies, then runs a MySQL/migration/admin preflight before replacing the active runtime. Database authentication, missing-database, privilege, migration, or bootstrap-admin failures therefore abort before service activation. The failed health check also prints the recent `texise.service` journal automatically."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Updates the homepage H1 to `TeXise — Privacy First Research` / `Writing Platform` and capability labels to `Research`, `Code`, `Document`."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Adds a four-card `Built for Real Workflows` section directly after Built Awesome using TeXise-local placeholder artwork until final workflow copy/images are supplied."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Carries canonical template source/live-catalog paths into runtime `release.env` and grants only those required template write boundaries to the unprivileged `texise` service."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 48,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Adds a filesystem-first Admin template platform over `texise-templates/free|pro`: secure ZIP import, complete metadata/institution editing, bulk management, structural validation, tier moves and administrator-triggered Assets Sync while preserving manual filesystem copy + sync operation."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Adopts the exact `TeXise — Local-First Overleaf Alternative LaTeX Research Editor with CLI` homepage H1/title and replaces the stale homepage competitor matrix with TeXise research-architecture positioning."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Enriches truthful template/article/entity schema and social metadata while retaining the supplied 1200×630 TeXise OG image as the generic fallback."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 55,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Continues core/public branding cleanup around TeXise Editor and TeXise Terminal and adds BF41/Hotfix10 fail-closed release guards."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "## 2026-08-23 — R14.28.20 Build Fix 40 / Hotfix9 SEO & TeXise Core Branding"
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Adds interconnected Organization/WebSite/WebPage and content-specific structured data, generic 1200×630 TeXise social media, CMS-cover blog social media, image sitemap data and a blog RSS feed."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 64,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- Rebrands TeXise-owned package/workspace/editor/desktop/mobile/storage identifiers while preserving required third-party package names, compiler endpoints, legal/source attribution and a safe legacy IndexedDB migration path."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 75,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Adds a progressive `Why TeXise? / Built Different` feature-card section immediately after the hero."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Three yellow TeXise cards are visible by default; Show more/Show less reveals nine additional cards using an accessible caret control."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 77,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "- Preserves Hotfix 5: wider rounded hero PDF, editor-column Terminal, body-font `@TeXiser`, exact 4% hero gradient and configured Pro CTA."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 82,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "- Restores the floating `@TeXiser` CTA to the normal body font and applies the exact requested 4% yellow hero gradient."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 88,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "- Preserves BF39.2 Source/Visual auto-reveal, simulated Compile/PDF, Terminal, mobile toolbar scrolling, Moranga @TeXiser, and glow-free background."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 92,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Adds an auto-moving, draggable, keyboard-accessible Source↔Visual reveal inside the simulated TeXise homepage editor while keeping Compile/PDF and Terminal interactions presentation-only."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 94,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "- Makes the real mobile editor toolbar horizontally scrollable without shrinking controls, applies Moranga to `@TeXiser`, and removes the homepage hero glow background."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 100,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Extends the TeXise wireframe into a taller detailed simulated editing session."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 112,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Replaces the previous homepage hero with a full-first-screen, TeXise-specific hero centered on a detailed static editor wireframe."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 115,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Uses the existing TeXise favicon, yellow brand treatment, faint scientific formulas/grid, current application vocabulary and reduced-motion handling."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 116,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "- Floating X CTA displays `@TeXiser`; destination remains `https://x.com/texiser`."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 121,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "BF38 refreshes the production favicon/PWA images, adds Facebook/X social surfaces, adds a persisted optional-cookie notice, enables Statcounter on every canonical production non-admin surface, and provisions consent-gated optional Google Tag runtime configuration through `/etc/texise/texise.env`. TX7.2.3 is preserved."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 123,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise SaaS Release Changelog"
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 131,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Installs the newly supplied desktop `/texise-logo.png` unchanged while retaining the BF36 mobile logo and responsive brand switching."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 146,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Reuses one `texise-account-popover` implementation for editor and SaaS/public headers: authenticated users get Projects, Settings and Logout, while anonymous users get Login only."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 147,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Installs the supplied official horizontal `/texise-logo.png` for desktop/tablet and square `/texise-logo-mobile.png` for mobile/compact views through responsive `<picture>` branding; removes active generated mark/word branding."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 189,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- **Administrator bootstrap security:** TeXise no longer creates `admin@texise.com` with a known password. Fresh deployments use `sudo texise-saas admin-create`; upgrades automatically revoke the exact historical `admin/admin` credential and its sessions while preserving already-secure administrator passwords."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 193,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- **Shared-project safety:** the Host snapshot structure is sealed at readiness. Same-room rematerialisation protects local extra or modified files under `.texise-local-recovery/` before applying the shared snapshot, using a retained per-room hash baseline to detect same-path divergence."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 203,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Source text, remote selections/carets and collaborator labels use one direct `y-codemirror.next` binding to each file's `Y.Text`. TeXise no longer computes a parallel Source cursor/selection position."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 241,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Images/PDFs/opaque project files use a transient chunked peer payload channel; the TeXise relay forwards frames only and does not retain binary content."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 261,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Retired the shared `TEXISE_EXECUTION_IMAGE` key and temporary host-side scientific Python overlay."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 274,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Canonical origin/root are now `https://www.texise.com` and `/var/www/texise.com/public_html`; `app.texise.com` is redirect-only compatibility and the former app tree is preserved for rollback."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 275,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Apache serves the production SPA from canonical `dist`, proxies `/api/`, the authoritative `/collab-live` Yjs document/awareness relay and compatibility-only `/collab-signal`, exposes the authenticated `/console-gateway` websocket surface for Cloud Terminal · Pro, denies `/texise-data` and `/texise-services`, serves public Blog media explicitly, and removes obsolete Hocuspocus/Laravel Reverb routes."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 276,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- The supplied private LaTeX compiler source is shipped under `texise-services/cloud-compile/` and brokered through server-authoritative Pro entitlement/quota enforcement. Local Compile remains browser-local and Free/default."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 278,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Cloud Compile and Linux Terminal use separate operator-configured images: `TEXISE_CLOUD_COMPILE_IMAGE=texlive/texlive:latest` and `TEXISE_CONSOLE_IMAGE=texlive/texlive-console:pro`. Dedicated `texise-compile` and `texise-console` service users isolate Docker authority from `www-data`."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 286,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Active trusted runtime/state now lives under `/var/www/app.texise.com/public_html/texise-data`; public Blog cover media lives under `/var/www/app.texise.com/public_html/texise-media/blog`. `/etc/texise` remains the protected configuration/signing boundary."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 287,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Historical `/var/lib/texise` and `/var/lib/texise-media` locations are read only as upgrade sources and are no longer active runtime destinations."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 289,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Apache serves `/texise-media/*`, denies `/texise-data/*`, and deployment preflight verifies service-user write/read plus real served image bytes before activation."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 290,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Existing `/blog-media/*` CMS cover URLs migrate to `/texise-media/blog/*`; old cover files are copied and byte-verified during upgrade."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 303,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- TeXise branding now uses Moranga for the mark and exact `Tex·ise` Moranga regular-italic wordmark. All eight production fonts preload before the application bundle and first render waits behind a bounded font gate."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 304,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Home uses the supplied Prefix hero only as a structural reference with TeXise copy and four real capability cards. Docs is removed from the top menu but remains in the shared public footer and search."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 305,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- `/projects` exposes only New Project plus a single action overflow (Templates, Link Folder, Import ZIP, Import from GitHub), shares the Home footer, and keeps all destructive/text-entry actions inside TeXise page modals."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 313,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Physical template assets moved to `texise-templates`; `/examples` redirects to `/templates`; install/upgrade removes stale legacy template trees only after validating the new authority."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 318,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise SaaS conversion release changelog"
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 324,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Moved the default writable AI Review SQLite audit path from `/etc/texise/ai-review-audit.sqlite3` to `/var/www/app.texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3`; `/etc/texise` remains configuration/signing material and read-only to the service."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 325,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Added upgrade migration for the historical TeXise-owned audit DB default, including the SQLite `-wal`/`-shm` companions when present. Custom administrator paths are preserved."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 326,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Kept `/etc/texise` ownership/modes strict: directory `root:texise 0750`; private/config files `root:texise 0640`; entitlement public key `root:texise 0640`. The public-key mode is intentional and contains no secret material."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 330,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "## TeXise R14.28.12 — SaaS/local-first conversion pass (2026-08-20)"
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 334,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Added an optional MySQL-backed account/CMS/support layer to the existing trusted TeXise Node server."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 341,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Added TeXise-owned Prefix-derived semantic light/dark tokens and compact productivity styling."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 370,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Migrated the existing template catalogue into `texise-templates/free/*` and `texise-templates/pro/*` source trees."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 414,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Confirmed the supplied template tree contains no preview/thumbnail assets; TeXise therefore uses the required safe placeholder fallback rather than fabricating previews."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 419,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Added an unconditional final `texise_normalize_config_permissions` pass to both install and upgrade flows."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 420,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/etc/texise` is normalized to `root:texise 0750`."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 421,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- Known TeXise-owned files (`texise.env`, `config.json`, `license-keys`, entitlement private/public keys and refresh key) are normalized to `root:texise 0640` without changing their contents."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 422,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Unknown administrator files under `/etc/texise` are deliberately not modified."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 428,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Strengthened `/etc/texise` normalization from a best-effort chmod/chown step into a verified installer post-condition."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 429,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Install/upgrade now verifies `/etc/texise` is exactly `root:texise 0750` after normalization."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 430,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- Every present known TeXise config/signing file is verified as exactly `root:texise 0640` after normalization."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 449,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `install.sh`/`upgrade.sh` now import the supplied Moranga/STIX browser fonts from `TEXISE_FONT_SOURCE_DIR` after Vite rebuilds `dist`."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 450,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- `Latinotype - Moranga Regular.otf` is installed as `Moranga-Regular.otf`, matching TeXise CSS."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 453,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Apache declares OTF/TTF MIME types and includes `/texise-fonts/` in immutable static caching."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 454,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- The official CSP continues to block Cloudflare-injected analytics by design; TeXise remains telemetry-free by default."
    },
    {
      "path": "docs/TEXISE_SAAS_RELEASE_CHANGELOG.md",
      "line": 461,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- Renamed the physical/static template namespace to `texise-templates`; `/templates` is now exclusively the public SPA route and `/examples` redirects there."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 31,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "- TeXise branding/provenance audit: **PASS** across the production-facing text surface."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 69,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Production Biome diagnostic fixed: BF39 capability container now uses `role=\"group\"` for `aria-label=\"TeXise capabilities\"`."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 75,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "BF39 is a homepage presentation release only. The simplified hero and `@TeXiser` capitalization are implemented without changing the TX7.2.3 collaboration wire protocol, editor runtime, compiler, TexLab, authentication, BF38 cookie consent or analytics routing."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 85,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# TeXise SaaS Validation Report"
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 163,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- TeXise SaaS/product/security static audits: **43/43 PASS**."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 179,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- PWA application cache: `texise-app-shell-r14-28-14-buildfix26-v1`."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 191,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- PWA application cache: `texise-app-shell-r14-28-14-buildfix25-v1`."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 217,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- BF22 rotates the application-shell cache to `texise-app-shell-r14-28-14-buildfix22-v1` and adds dependency-free regression/release checks for these exact compiler failures."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 223,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- BF21 uses the standard Yjs authority model: state-vector Sync Step 1/2 and awareness transport, stable room Y.Doc ownership, direct CodeMirror↔Y.Text binding and a guarded downstream application projection. TeXise-specific Visual/AI operations still enter the same Y.Text authority through canonical mutation events."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 234,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Production BF19 exposed a TikZ presentation regression: the outer TeXise dialog stayed around the shared `sm:max-w-sm` desktop width even though TikZ requested `97vw`, producing the narrow/tall workspace seen in the browser screenshot."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 237,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- TikZ Draw tools are rethemed from dark tiles to TeXise white/yellow controls with black icons, yellow active/primary state, pale-yellow hover, and normalized panel selection/header surfaces."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 238,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- PWA application-shell cache advances to `texise-app-shell-r14-28-14-buildfix20-v1`."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 258,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Collaboration: `/collab-live` is authoritative; production checker certifies snapshot replay, document update, awareness and peer departure. Browser E2E source is migrated to two independent contexts and no longer relies on the old `texise-collaboration-signaling` localStorage override."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 287,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Full BF14 audit is recorded in `docs/TEXISE_FULL_PRODUCT_AUDIT_R14_28_14_BF14.md`."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 300,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Build Fix 10 adds an explicit Apache `301 /examples -> https://www.texise.com/templates` rule on both HTTP and HTTPS vhosts before catch-all routing."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 301,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Server execution images are now intentionally separate: Cloud Compile uses `texlive/texlive:latest`; Linux Terminal Pro uses `texlive/texlive-console:pro`. The old shared `TEXISE_EXECUTION_IMAGE` key and host-mounted scientific Python overlay are retired."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 302,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Cloud Docker execution pins explicit `latexmk` and `synctex` entrypoints; terminal execution pins `/bin/bash`, preventing image ENTRYPOINT metadata from changing TeXise command semantics."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 326,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Build Fix 5 derives the source root from `import.meta.url` and adds regression coverage so certification can be launched from `/var/www/texise.com`, `/root`, or any other operator working directory."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 327,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- `127.0.0.1:3100` remains the private trusted API listener and is unrelated to the historical `app.texise.com` Apache vhost shown in the production diagnostic."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 332,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- The remaining deployment failure was isolated to `texise-latex-compile.service`: an already-running `Restart=always` unit raced `npm ci` and briefly observed a missing `express`, then the dedicated `texise-compile` user consistently failed with `EACCES` because parent `texise-data`/`tmp` directories denied traversal."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 333,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Build Fix 4 quiesces existing Cloud/Console units during dependency replacement, validates their dependency markers, grants execute-only parent traversal (`0751` for `texise-data`, `0711` for `texise-data/tmp`) while retaining private service-owned child workspaces, and probes write access as each service account before activation."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 341,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Deployment then failed only because `texise_cloud_compile_health_check` double-escaped its Bash ERE and misclassified `http://127.0.0.1:3001/api/compile` as non-loopback."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 373,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Packaging scan: no font binaries, `node_modules`, `.env`, PEM/private-key files, runtime `texise-data`, or production `texise-media` files are permitted in the release artifact."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 374,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Canonical active origin/root are `https://www.texise.com` and `/var/www/texise.com/public_html`; `app.texise.com` and `/var/lib/texise*` references are restricted to migration, redirect, rollback or regression-test compatibility."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 421,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# TeXise SaaS final validation report"
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 424,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Baseline: TeXise R14.28.12 / R31 Build Fix 4.4 source supplied for this conversion."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 441,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- TeXise SaaS/product/security static audit: **43/43 PASS**."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 448,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Active runtime/media architecture uses `public_html/texise-data` and `public_html/texise-media`; `/var/lib/texise*` occurs only in explicit historical upgrade-migration compatibility paths."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 555,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "EXISTING TEXISE REGRESSION: NOT RUNTIME-VERIFIED"
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 607,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "8. Re-run the existing TeXise editor compiler/SyncTeX/Visual/MathLive/AI/Paper Memory/terminal/mobile release suite."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 623,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "The deployment hardening fix for AI Review state is covered by 7/7 dependency-free installer/config tests: the retired `/etc/texise/ai-review-audit.sqlite3` default migrates to `/var/www/app.texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3`, and an existing old DB is moved only at the service restart boundary."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 625,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "## `/etc/texise` permission post-condition — 2026-08-20"
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 627,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "**SOURCE VERIFICATION: PASS.** Install/upgrade now normalizes and then verifies `/etc/texise` as `root:texise 0750`. Each present known TeXise file (`texise.env`, `config.json`, `license-keys`, `entitlement-private.pem`, `entitlement-public.pem`, `entitlement-refresh.key`) must verify as `root:texise 0640` or deployment aborts with the observed mismatch. The exact legacy `entitlement-public.pem root:root 0644` case is covered by an executable regression and preserves file contents while correcti"
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 635,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Public CMS content and admin CMS preview use one `SanitizedHtml` boundary. The single `dangerouslySetInnerHTML` call is narrowly documented/suppressed because the HTML comes only from TeXise's server-side sanitized Markdown renderer."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 651,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Real production MySQL (`texise_db`) preflight and systemd restart: requires execution on the deployment host; installer now performs and reports this before activating a new runtime."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 655,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Root cause: fonts were copied into `dist/texise-fonts` before Vite rebuilt `dist`, so they were deleted."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 664,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Cloudflare Insights CSP warning: expected/intentional while TeXise remains telemetry-free by default; disable Cloudflare Web Analytics at the proxy if a clean console is desired without weakening CSP."
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 684,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Static template namespace `/texise-templates/*`: **PASS**"
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 707,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Template manifest regeneration under `texise-templates`: **PASS**"
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 712,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Home TeXise hero / four capability cards / Start Writing → `/projects`: **PASS**"
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 716,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Product-wide TeXise native dialog elimination (`alert`/`confirm`/`prompt`): **PASS**"
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 718,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- TeXise Blog search/tag/featured-card layout: **PASS**"
    },
    {
      "path": "docs/TEXISE_SAAS_VALIDATION_REPORT.md",
      "line": 741,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- real MySQL `texise_db` preflight/migrations"
    },
    {
      "path": "docs/electron-desktop-release.md",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "TeXise Desktop is a thin Electron wrapper around the existing Vite browser"
    },
    {
      "path": "docs/electron-desktop-release.md",
      "line": 4,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "app. It uses the custom origin `texise://app/` so IndexedDB and localStorage stay"
    },
    {
      "path": "docs/electron-desktop-release.md",
      "line": 42,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`TEXISE_RELEASE_VERSION` overrides the root `package.json` version during CI"
    },
    {
      "path": "docs/electron-desktop-release.md",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Nightly builds use product name `TeXise Nightly`; stable builds use"
    },
    {
      "path": "docs/electron-desktop-release.md",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "`TeXise`."
    },
    {
      "path": "docs/learnitive-2-autonomous-state.md",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Staging only: `https://os.learnitive.com`, `/var/www/os.learnitive.com`, `/etc/learnitive`. Do not modify `/etc/texise/*`, TeXise vhosts/services/data, or unrelated Apache/systemd infrastructure."
    },
    {
      "path": "docs/learnitive-2-autonomous-state.md",
      "line": 45,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "Verification: 351/351 broad server/static tests PASS; 10/10 project-runtime PASS; migration tests 15/15 PASS; capability audit 32/32 with 0 blockers; lock sync, trusted runtime manifest, R12 release audit, Learnitive brand audit, TeXise provenance audit, installer syntax and server/Console Gateway syntax all PASS."
    },
    {
      "path": "docs/learnitive-vibe-coding-state.md",
      "line": 10,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "Verification on exact R8 source: broad server/static 354/354 PASS; runtime 10/10; capability 37/37; TypeScript/TSX syntax 207/207; frozen lock, trusted runtime, R12, Learnitive branding, TeXise provenance, installer and server/gateway syntax PASS."
    },
    {
      "path": "docs/services.md",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "TeXise keeps service wiring explicit and small. Services should be easy to"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise deployment foundation"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "TeXise production is designed for `https://www.texise.com` behind Apache2. The"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "/var/www/texise.com/public_html/"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 17,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html` — complete TeXise source tree."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/dist` — active browser build served by Apache."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/texise-media` — intentionally public,"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 20,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "immutable CMS media; Blog covers live under `texise-media/blog`."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/texise-data` — private trusted-service"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 22,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "runtime/data root. Apache explicitly denies `/texise-data/*`."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/dist.previous` — previous browser build,"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/server` — trusted Node API source staged by the installer."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/texise-data/runtime/current/server` — active trusted API runtime snapshot used by `texise.service`."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/texise-data/runtime/previous` — previous API runtime retained for paired rollback."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/etc/texise` — configuration, predefined licence hashes, and entitlement"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 30,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/texise-data/audit` — writable trusted audit state."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 31,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/texise-data/cache` — writable server/compiler caches."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/texise-data/tmp` — writable trusted temporary state."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 33,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/texise-data/log` — service-specific logs/data."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 35,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "There is no R13 `/opt/texise` API release tree and no"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "`/var/www/app.texise.com/releases` frontend tree. `public_html` is never replaced"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 46,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "/var/www/texise.com/public_html/package.json"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 52,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "sudo mkdir -p /var/www/texise.com/public_html"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 53,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "sudo unzip texise-source.zip -d /var/www/texise.com/public_html"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 54,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "cd /var/www/texise.com/public_html"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 58,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "the repository root itself is `/var/www/texise.com/public_html` before"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 76,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "cd /var/www/texise.com/public_html"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 82,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "1. verifies the source is `/var/www/texise.com/public_html`;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 83,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "2. creates dedicated `texise`, `texise-compile` and `texise-console` service accounts; only the two execution accounts receive Docker supplemental-group access;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 85,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "4. installs `/etc/texise/texise.env` and `config.json` only when absent;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 86,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "5. creates `/etc/texise/license-keys`;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 90,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "8. runs the TeXise static contract audit and prepares optional browser compiler assets;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 93,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "11. stages a paired trusted-API runtime snapshot under `/var/www/texise.com/public_html/texise-data/runtime/current`;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 94,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "12. installs the `texise-license` administration command;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 95,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "13. installs/enables `texise.service`, `texise-latex-compile.service` and `texise-console-gateway.service`;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 97,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "`DocumentRoot /var/www/texise.com/public_html/dist`;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 101,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "The canonical certificate is discovered/validated for both `texise.com` and `www.texise.com`. The existing `app.texise.com` certificate is discovered independently for the redirect-only compatibility vhost; certificate paths are never guessed from the primary certificate."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 128,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "/var/www/texise.com/public_html/dist"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 140,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "/var/www/texise.com/public_html/dist"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 152,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "wss://www.texise.com/collab-live"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 156,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "`/collab-signal` remains temporarily available only for migration compatibility with older y-webrtc clients. Current TeXise clients synchronize manuscript Yjs updates and awareness through `/collab-live`; the trusted relay retains bounded opaque room state in memory for reconnect tolerance and does not persist manuscript files."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 161,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "wss://www.texise.com/console-gateway/console/<session-id>"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 165,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The short-lived terminal credential is carried in `Sec-WebSocket-Protocol`, not the URL. Gateway `/internal/*` HTTP APIs remain loopback/private and are called only by `texise.service`. Obsolete `/collab-ws`, `/app/*` and `/apps/*` routes are not exposed by the canonical vhost."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 178,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The execution services use separate images and policies: Cloud Compile uses `TEXISE_CLOUD_COMPILE_IMAGE=texlive/texlive:latest`; Linux Terminal Pro uses `TEXISE_CONSOLE_IMAGE=texlive/texlive-console:pro`. The default Console image is a TeXise-local build produced from `deploy/docker/console/`, not a Docker Hub pull; custom non-default Console images remain operator-managed external images."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 180,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise-latex-compile.service` runs as dedicated `texise-compile`, listens on `127.0.0.1:3001`, accepts only the private `X-Compile-Secret`, and launches non-interactive/no-network Docker jobs with no shell escape and bounded resources. Active jobs live under `public_html/texise-data/tmp/cloud-compile`."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 182,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "`texise-console-gateway.service` runs as dedicated `texise-console`, listens on `127.0.0.1:8787`, and launches interactive Pro sessions with a per-session writable workspace under `public_html/texise-data/tmp/console`. The terminal container has controlled bridge egress for GitHub/Python/scientific workflows but no Docker socket, host filesystem mount or TeXise secret mount. Workspace path confinement, quotas, idle/session expiry and cleanup are enforced by the gateway."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 184,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise-collab.service` and `texise-reverb.service` are retained only as rollback units and are disabled after the modern health checks succeed."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 188,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise.service` runs from the rollback-capable runtime snapshot:"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 191,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "WorkingDirectory=/var/www/texise.com/public_html/texise-data/runtime/current/server"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 192,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ExecStart=/usr/bin/node /var/www/texise.com/public_html/texise-data/runtime/current/server/index.mjs"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 197,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "It runs as the unprivileged `texise` service user. Trusted configuration remains"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 198,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "read-only under `/etc/texise`. The service runtime snapshot under"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 199,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`public_html/texise-data/runtime/current` is also read-only; write access is"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 200,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "restricted to `public_html/texise-data/{audit,cache,tmp,log}` and"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 201,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`public_html/texise-media/blog`. Apache serves `/texise-media/*` as static media"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 202,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "and explicitly denies `/texise-data/*`."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 208,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "1. `/etc/texise/config.json` for non-secret product switches;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 209,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "2. `/etc/texise/texise.env` / process environment for deployment values and"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 212,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`TEXISE_CONFIG_FILE` can point the trusted service at another JSON config file."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 213,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Environment values such as `TEXISE_PUBLIC_URL` override matching JSON values."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 225,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "`/api/license/activate` checks `/etc/texise/license-keys` first and then, when"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 227,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "stays only in `/etc/texise/texise.env`; it is never included in the browser"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 228,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "bundle. `PAYHIP_PRODUCT_LINK` may be set as an additional response check using Payhip's short `product_link` token (for example `mVT0`) or a normal Payhip `/b/<token>` product URL. `TEXISE_SHOP` remains the public checkout destination and is never compared as a full URL against Payhip's short API token."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 233,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "`/etc/texise/entitlement-refresh.key`, so periodic revalidation remains"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 238,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "with `TEXISE_LICENSE_REFRESH_DAYS` and `TEXISE_LICENSE_OFFLINE_GRACE_DAYS`."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 242,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "The installer places `texise-license` at `/usr/local/bin/texise-license`."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 245,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "sudo texise-license add TEXISE-PRO-XXXX-XXXX"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 246,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "sudo texise-license remove TEXISE-PRO-XXXX-XXXX"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 247,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "texise-license list"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 250,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Only SHA-256 hashes are stored in `/etc/texise/license-keys`; `list` displays"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 262,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "R14.21 first runs dependency-free archive hardening tests and `release-runtime-preflight.json`, then performs a frozen install, lint/type checks, unit tests, full BusyTeX compiler provisioning, production build, the TeXise static contract audit, Playwright browser installation, the complete production-preview E2E suite in branded Microsoft Edge, Chromium, and Firefox, plus the Chromium-ZIP-to-Firefox portability gate. A machine-readable `release-quality-report.json` records every step. Only afte"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 264,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Normal `TEXISE_COMPILER_PROFILE=full` install/upgrade no longer reruns this complete CI/browser matrix. It performs the release lint/type gates, provisions and verifies the full compiler profile, runs the static contract audit, builds the production browser artifact, and performs deployment health checks. The first install stores the versioned BusyTeX runtime under `/var/www/texise.com/public_html/texise-data/cache/compiler`; later upgrades using the same BusyTeX version restore it from that per"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 266,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Formal browser certification remains explicit: run `pnpm run release:quality` on the release candidate, or set `TEXISE_DEPLOY_CERTIFY=1` (for example, `sudo env TEXISE_DEPLOY_CERTIFY=1 ./scripts/install.sh`) when intentionally asking the installer to perform the complete unit + Edge/Chromium/Firefox certification before activation. A deliberately reduced `pdflatex` profile can still build for constrained/offline deployments, but it does not receive the full three-engine production-browser certif"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 271,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DEPLOY_URL=https://staging.example.org pnpm run release:deployment-smoke"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 276,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The repository also contains `.github/workflows/texise-release-quality.yml` so the same matrix can run on pushes, pull requests, and manually."
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 284,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "cd /var/www/texise.com/public_html"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 288,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "The upgrade preserves every `/etc/texise/*` file, runs a frozen-lockfile PNPM"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 299,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "cd /var/www/texise.com/public_html"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 306,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- the source repository under `/var/www/texise.com/public_html`;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 307,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/etc/texise` configuration and signing material;"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 324,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "node scripts/texise-release-audit.mjs"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 327,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "The audit checks TeXise identity, the root-dist build contract, Apache's exact"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 334,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "The root-scoped `texise-texlive-sw.js` caches the application shell and"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 335,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "same-origin immutable browser assets. After a successful online visit TeXise"
    },
    {
      "path": "docs/texise-deployment.md",
      "line": 345,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Scientific Python packages are part of the dedicated `texlive/texlive-console:pro` image itself; TeXise no longer provisions or mounts a host-side Python overlay."
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "# TeXise production release checklist"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "This checklist is for releases of the browser-first TeXise application hosted at"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "`https://www.texise.com` behind Apache2."
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "`/var/www/texise.com/public_html`."
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 18,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "node scripts/texise-release-audit.mjs"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "From `/var/www/texise.com/public_html`:"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 42,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "test -f /var/www/texise.com/public_html/dist/index.html"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 43,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "test -f /var/www/texise.com/public_html/dist/manifest.webmanifest"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 44,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "test -f /var/www/texise.com/public_html/dist/texise-texlive-sw.js"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 45,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "test -d /var/www/texise.com/public_html/dist/assets"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 46,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "test -d /var/www/texise.com/public_html/dist/locales"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "test -d /var/www/texise.com/public_html/dist/mathlive-fonts"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 48,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "test -f /var/www/texise.com/public_html/dist/compiler/swiftlatex-r3-v1/swiftlatexpdftex.wasm"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Before testing optional features, prove the primary TeXise journey is no longer"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 92,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "9. run TeXise Doctor;"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 95,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "12. create range, cursor/point, semantic-object and project comments in both Source and Visual modes; reply, resolve and reopen them, reload to verify local persistence, and confirm canonical `.tex` contains no TeXise review markup;"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 128,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl status texise"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 132,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Confirm `/etc/texise/*` is preserved and permissioned correctly, including:"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 134,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- `texise.env`"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 147,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "WorkingDirectory=/var/www/texise.com/public_html/texise-data/runtime/current/server"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 148,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ExecStart=/usr/bin/node /var/www/texise.com/public_html/texise-data/runtime/current/server/index.mjs"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 156,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "DocumentRoot /var/www/texise.com/public_html/dist"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 159,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "and does **not** use `/var/www/texise.com/public_html` as the DocumentRoot."
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 161,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "Against `https://www.texise.com` confirm:"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 173,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- an unknown SPA route such as `/__texise_spa_health__` returns the app shell."
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 179,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- source remains at `/var/www/texise.com/public_html` and is not replaced by"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 181,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- existing `/etc/texise/*` survives unchanged;"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 184,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- no `/opt/texise` or `/var/www/app.texise.com/releases` tree is created;"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 197,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "activation smokes against `https://www.texise.com`. Inspect the browser console,"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 198,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "Apache logs, and `texise.service` logs for new errors before declaring the"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 215,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- while the equation editor is open, change canonical Source and then attempt Apply; TeXise must reject the stale edit;"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 253,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "## R14.11 TeXise Visual UX gate"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 257,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- hover an editable Visual block and confirm the TeXise left `+` and drag grip appear;"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 272,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "pnpm run texise:contract-audit"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 276,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise:contract-audit` validates source/package/deployment invariants only. It is **not** browser/runtime certification. A production release is certified only when `release:quality` completes and writes `dist/release/certification.json` with `artifactKind: runtime-browser-certification`, `certificationLevel: production-browser`, and `status: passed`."
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 288,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "## R14.13 Native TeXise Visual interaction gate"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 311,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- [ ] Type `/sec` in Visual and insert a section using the native TeXise suggestion engine."
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 313,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "- [ ] pdfLaTeX compiles the real root directly; logs contain neither `__texise_synctex__.tex` nor `\\synctex=1`."
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 339,
      "category": "source-history-internal-note",
      "rationale": "non-public implementation/source-history documentation",
      "text": "- [ ] Verify Source and Visual use the shared TeXise MathLive path and MathLive failures remain locally recoverable."
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 375,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SCIENTIFIC_RUNTIME_LIVE=1 \\"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 376,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_C_CPP_LIVE=1 \\"
    },
    {
      "path": "docs/texise-release-checklist.md",
      "line": 384,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`TEXISE_SCIENTIFIC_RUNTIME_LIVE=1` is supplied; certification metadata must not"
    },
    {
      "path": "globals.d.ts",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "declare var __TEXISE_BUILD_TIME_CONFIG__: string | undefined;"
    },
    {
      "path": "globals.d.ts",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "declare var __TEXISE_INJECTED_CONFIG__: string | undefined;"
    },
    {
      "path": "globals.d.ts",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// TeXise production entitlement trust root, injected by Vite at build time."
    },
    {
      "path": "globals.d.ts",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "declare var __TEXISE_ENTITLEMENT_PUBLIC_KEY__: string | undefined;"
    },
    {
      "path": "globals.d.ts",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "declare var __TEXISE_ENTITLEMENT_KEY_ID__: string | undefined;"
    },
    {
      "path": "globals.d.ts",
      "line": 108,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// TeXise Toast UI Editor 3.2.2 compatibility declaration."
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const SECRET = String(process.env.LEARNITIVE_CONSOLE_GATEWAY_SECRET || process.env.TEXISE_CONSOLE_GATEWAY_SECRET || '').trim();"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const IMAGE = String(process.env.LEARNITIVE_CONSOLE_IMAGE || process.env.LEARNITIVE_DEVELOPMENT_IMAGE || process.env.TEXISE_CONSOLE_IMAGE || 'learnitive/development:2026.08').trim();"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 17,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const DOCKER = process.env.LEARNITIVE_CONSOLE_DOCKER_BIN || process.env.TEXISE_CONSOLE_DOCKER_BIN || '/usr/bin/docker';"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const PACKAGES_GIT_NETWORK = process.env.LEARNITIVE_CONSOLE_PACKAGES_GIT_NETWORK || process.env.LEARNITIVE_CONSOLE_NETWORK || process.env.TEXISE_CONSOLE_NETWORK || 'learnitive-os-egress';"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MEMORY = process.env.LEARNITIVE_CONSOLE_MEMORY || process.env.TEXISE_CONSOLE_MEMORY || '2g';"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const CPUS = process.env.LEARNITIVE_CONSOLE_CPUS || process.env.TEXISE_CONSOLE_CPUS || '2';"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const PIDS_LIMIT = String(boundedInt(process.env.LEARNITIVE_CONSOLE_PIDS_LIMIT || process.env.TEXISE_CONSOLE_PIDS_LIMIT, 256, 32, 4096));"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TMP_SIZE = process.env.LEARNITIVE_CONSOLE_TMP_SIZE || process.env.TEXISE_CONSOLE_TMP_SIZE || '512m';"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const WORK_ROOT = process.env.LEARNITIVE_CONSOLE_WORK_DIR || process.env.TEXISE_CONSOLE_WORK_DIR || '/var/www/os.learnitive.com/learnitive-data/tmp/console';"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const DEFAULT_SANDBOX_SECONDS = boundedInt(process.env.LEARNITIVE_CONSOLE_SESSION_SECONDS || process.env.TEXISE_CONSOLE_SESSION_SECONDS, 60 * 60, 300, 30 * 24 * 60 * 60);"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 31,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const IDLE_SECONDS = boundedInt(process.env.LEARNITIVE_CONSOLE_IDLE_SECONDS || process.env.TEXISE_CONSOLE_IDLE_SECONDS, 30 * 60, 60, 8 * 60 * 60);"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TOKEN_SECONDS = boundedInt(process.env.LEARNITIVE_CONSOLE_TOKEN_SECONDS || process.env.TEXISE_CONSOLE_TOKEN_SECONDS, 5 * 60, 30, 30 * 60);"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 33,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_SESSIONS = boundedInt(process.env.LEARNITIVE_CONSOLE_MAX_SESSIONS || process.env.TEXISE_CONSOLE_MAX_SESSIONS, 64, 1, 512);"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 34,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_SESSIONS_PER_USER = boundedInt(process.env.LEARNITIVE_CONSOLE_MAX_SESSIONS_PER_USER || process.env.TEXISE_CONSOLE_MAX_SESSIONS_PER_USER, 8, 1, 32);"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_FILES = boundedInt(process.env.LEARNITIVE_CONSOLE_MAX_FILES || process.env.TEXISE_CONSOLE_MAX_FILES, 5000, 1, 50000);"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 36,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_WORKSPACE_BYTES = boundedInt(process.env.LEARNITIVE_CONSOLE_MAX_WORKSPACE_BYTES || process.env.TEXISE_CONSOLE_MAX_WORKSPACE_BYTES, 25_000_000_000, 1_000_000, 100_000_000_000);"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 39,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_LEGACY_UPLOAD_REQUEST_BYTES = boundedInt(process.env.LEARNITIVE_CONSOLE_LEGACY_UPLOAD_REQUEST_BYTES || process.env.LEARNITIVE_CONSOLE_MAX_UPLOAD_BYTES || process.env.TEXISE_CONSOLE_MAX_UPLOAD_BYTES, 50_000_000, 1024, 500_000_000);"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 41,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_BUFFERED_DOWNLOAD_BYTES = boundedInt(process.env.LEARNITIVE_CONSOLE_BUFFERED_DOWNLOAD_BYTES || process.env.LEARNITIVE_CONSOLE_MAX_DOWNLOAD_BYTES || process.env.TEXISE_CONSOLE_MAX_DOWNLOAD_BYTES, 100_000_000, 1024, 1_000_000_000);"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 54,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const CONTAINER_UID = String(process.env.LEARNITIVE_CONSOLE_UID || process.env.TEXISE_CONSOLE_UID || process.getuid?.() || 10001);"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 55,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const CONTAINER_GID = String(process.env.LEARNITIVE_CONSOLE_GID || process.env.TEXISE_CONSOLE_GID || process.getgid?.() || 10001);"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 208,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "async function proxyPreview(req,res,context,key,suffix,previewQuery=''){const state=await processState(context,key);if(!state||state.status!=='running'||!state.port)throw httpError('preview_unavailable',404);const ip=await containerNetworkIp(context.containerName);const normalizedQuery=String(previewQuery||'').replace(/^\\?/u,'');const targetPath=`/${String(suffix||'').replace(/^\\/+/, '')}${normalizedQuery?`?${normalizedQuery}`:''}`;const headers={...req.headers,host:`${ip}:${state.port}`};delete"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 240,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const wss=new WebSocketServer({noServer:true,maxPayload:256*1024,handleProtocols:(protocols)=>protocols.has('learnitive-console')?'learnitive-console':protocols.has('texise-console')?'texise-console':false});"
    },
    {
      "path": "learnitive-services/console-gateway/server.js",
      "line": 242,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "server.on('upgrade',async(req,socket,head)=>{try{const url=new URL(req.url||'/',`http://${req.headers.host||'127.0.0.1'}`);const previewMatch=url.pathname.match(/^\\/internal\\/sandboxes\\/projects\\/([0-9a-f-]{36})\\/processes\\/([A-Za-z0-9_-]{1,80})\\/preview-ws(?:\\/(.*))?$/iu);if(previewMatch){if(!internalAuthorized(req))throw new Error('Forbidden');const[,projectId,processKey,suffix='']=previewMatch;const userId=safePrincipalId(url.searchParams.get('userId'));const generation=Number(url.searchParam"
    },
    {
      "path": "learnitive-services/universal-runner/server.mjs",
      "line": 179,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "secret:String(env.LEARNITIVE_RUNNER_SECRET||env.TEXISE_COMPILE_SHARED_SECRET||'').trim(),"
    },
    {
      "path": "learnitive-services/universal-runner/server.node.test.mjs",
      "line": 113,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.equal(normalizeRunnerConfig({TEXISE_COMPILE_SHARED_SECRET:'old'}).secret,'old');"
    },
    {
      "path": "package.json",
      "line": 51,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"desktop:open\": \"pnpm desktop:build && TEXISE_DESKTOP_BROWSER_DIST=\\\"$PWD/packages/tooling/browser-entry/dist\\\" pnpm --filter \\\"@learnitive/desktop-entry\\\" exec electron \\\"$PWD/packages/tooling/desktop-entry/dist/main.cjs\\\"\","
    },
    {
      "path": "package.json",
      "line": 78,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"texise:release-audit\": \"node scripts/texise-release-audit.mjs\","
    },
    {
      "path": "package.json",
      "line": 84,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"texise:contract-audit\": \"node scripts/texise-release-audit.mjs\","
    },
    {
      "path": "package.json",
      "line": 93,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"release:branding\": \"node scripts/verify-texise-branding.mjs\","
    },
    {
      "path": "packages/core/app/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/core/app/src/code-ai.ts",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const BLOCKED_PATH = /(?:^|\\/)(?:\\.git|node_modules|dist|build|coverage|\\.learnitive-tmp|\\.texise)(?:\\/|$)/i;"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'data-texise-window-controls-overlay',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'data-texise-window-controls-overlay-controls',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 195,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "{ platform: 'webapp', url: 'https://www.texise.com/manifest.webmanifest' },"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 224,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Reflect.deleteProperty(window, 'texiseDesktop');"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 228,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Object.defineProperty(window, 'texiseDesktop', {"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 297,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'https://app.example.com/?launch=web%2Btexise%3A%2F%2Fopen',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 306,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "`web+texise://open?hash=${encodeURIComponent("
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 374,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(assign).toHaveBeenCalledWith('web+texise://open');"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 388,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "`web+texise://open?hash=${encodeURIComponent("
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 409,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'https://app.example.com/?launch=web%2Btexise%3A%2F%2Fopen#route=welcome',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 421,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "`web+texise://open?hash=${encodeURIComponent("
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 490,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(documentRef.title).toBe('TeXise');"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 521,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'data-texise-window-controls-overlay',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 526,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'data-texise-window-controls-overlay-controls',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 531,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-titlebar-area-width',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 554,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'data-texise-window-controls-overlay',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 586,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'data-texise-window-controls-overlay-controls',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 591,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-titlebar-area-x',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 596,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-titlebar-area-height',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 630,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'data-texise-window-controls-overlay-controls',"
    },
    {
      "path": "packages/core/app/src/common/__tests__/pwa-install.spec.ts",
      "line": 635,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-titlebar-area-width',"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 41,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "texiseDesktop?: unknown;"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 90,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const WINDOW_CONTROLS_OVERLAY_ATTRIBUTE = 'data-texise-window-controls-overlay';"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 92,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'data-texise-window-controls-overlay-controls';"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 96,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const PWA_PROTOCOL_LAUNCH_URL = 'web+texise://open';"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 245,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'--texise-titlebar-area-x',"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 249,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'--texise-titlebar-area-y',"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 253,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'--texise-titlebar-area-width',"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 257,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'--texise-titlebar-area-height',"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 290,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "return (windowRef as WindowWithDesktopBridge).texiseDesktop !== undefined;"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 363,
      "category": "source-history-internal-note",
      "rationale": "non-rendered implementation comment",
      "text": "* Extracts the app hash route carried by a `web+texise://open?hash=...`"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 374,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "if (url.protocol !== 'web+texise:') {"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 384,
      "category": "source-history-internal-note",
      "rationale": "non-rendered implementation comment",
      "text": "* `focus-existing` launch handler. A `web+texise` protocol launch focuses"
    },
    {
      "path": "packages/core/app/src/common/pwa-install.ts",
      "line": 527,
      "category": "source-history-internal-note",
      "rationale": "non-rendered implementation comment",
      "text": "* `web+texise` protocol registered in the web app manifest. The tab's"
    },
    {
      "path": "packages/core/app/src/components/__tests__/floating-research-dock.spec.tsx",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dock = view.getByTestId('texise-research-dock');"
    },
    {
      "path": "packages/core/app/src/components/__tests__/floating-research-dock.spec.tsx",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(buttons[1]?.getAttribute('aria-label')).toBe('Open TeXise AI');"
    },
    {
      "path": "packages/core/app/src/components/__tests__/floating-research-dock.spec.tsx",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dock = view.getByTestId('texise-research-dock');"
    },
    {
      "path": "packages/core/app/src/components/__tests__/floating-research-dock.spec.tsx",
      "line": 49,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(view.getByLabelText('Minimize TeXise AI')).toHaveAttribute('aria-pressed', 'true');"
    },
    {
      "path": "packages/core/app/src/components/__tests__/floating-research-dock.spec.tsx",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dock = view.getByTestId('texise-research-dock');"
    },
    {
      "path": "packages/core/app/src/components/__tests__/pdf-preview-pane.spec.ts",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "str: 'TeXise mobile PDF',"
    },
    {
      "path": "packages/core/app/src/components/__tests__/pdf-preview-pane.spec.ts",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(container.textContent).toContain('TeXise mobile PDF');"
    },
    {
      "path": "packages/core/app/src/components/__tests__/pdf-preview-pane.spec.ts",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(container.querySelector('span')?.dataset.texiseTextIndex).toBe('0');"
    },
    {
      "path": "packages/core/app/src/components/account-popover.tsx",
      "line": 25,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "? 'texise-account-menu texise-editor-account desktop-titlebar-no-drag'"
    },
    {
      "path": "packages/core/app/src/components/account-popover.tsx",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ": 'texise-account-menu';"
    },
    {
      "path": "packages/core/app/src/components/account-popover.tsx",
      "line": 27,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const triggerClassName = editor ? 'texise-avatar texise-editor-avatar' : 'texise-avatar';"
    },
    {
      "path": "packages/core/app/src/components/account-popover.tsx",
      "line": 68,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className=\"texise-account-popover texise-account-popover-portal\""
    },
    {
      "path": "packages/core/app/src/components/account-popover.tsx",
      "line": 70,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-account-popover\""
    },
    {
      "path": "packages/core/app/src/components/ai-chat-overlay.tsx",
      "line": 96,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"overflow-hidden rounded-lg border bg-muted/30\" data-testid=\"texise-ai-assistant-card\">"
    },
    {
      "path": "packages/core/app/src/components/ai-chat-overlay.tsx",
      "line": 125,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"overflow-hidden rounded-lg border bg-muted/40\" data-testid=\"texise-ai-latex-snippet\">"
    },
    {
      "path": "packages/core/app/src/components/ai-chat-overlay.tsx",
      "line": 551,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div ref={scrollRef} className=\"min-h-32 flex-1 space-y-3 overflow-y-auto p-3\" data-testid=\"texise-ai-messages\">"
    },
    {
      "path": "packages/core/app/src/components/ai-chat-overlay.tsx",
      "line": 662,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"space-y-2 rounded-lg border border-amber-300 bg-amber-50/70 p-3 text-xs dark:border-amber-900 dark:bg-amber-950/20\" data-testid=\"texise-ai-proposal\">"
    },
    {
      "path": "packages/core/app/src/components/ai-chat-shell.tsx",
      "line": 61,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-ai-shell\""
    },
    {
      "path": "packages/core/app/src/components/ai-conversation-shell.tsx",
      "line": 13,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const AI_SHELL_SIZE_STORAGE_KEY = 'texise:ai-conversation-shell:size:v2';"
    },
    {
      "path": "packages/core/app/src/components/ai-conversation-shell.tsx",
      "line": 14,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AI_SHELL_LEGACY_SIZE_STORAGE_KEY = 'texise:ai-conversation-shell:size:v1';"
    },
    {
      "path": "packages/core/app/src/components/ai-conversation-shell.tsx",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const AI_SHELL_DIMENSIONS_STORAGE_KEY = 'texise:ai-conversation-shell:dimensions:v2';"
    },
    {
      "path": "packages/core/app/src/components/ai-conversation-shell.tsx",
      "line": 134,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "frame.style.setProperty('--texise-ai-width', `${nextDimensions.width}px`);"
    },
    {
      "path": "packages/core/app/src/components/ai-conversation-shell.tsx",
      "line": 135,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "frame.style.setProperty('--texise-ai-height', `${nextDimensions.height}px`);"
    },
    {
      "path": "packages/core/app/src/components/ai-conversation-shell.tsx",
      "line": 203,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'--texise-ai-width': `${dimensions.width}px`,"
    },
    {
      "path": "packages/core/app/src/components/ai-conversation-shell.tsx",
      "line": 204,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'--texise-ai-height': `${dimensions.height}px`,"
    },
    {
      "path": "packages/core/app/src/components/ai-conversation-shell.tsx",
      "line": 213,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className={`pointer-events-auto fixed inset-0 z-[71] flex min-h-0 flex-col overflow-hidden border bg-background shadow-xl sm:h-[var(--texise-ai-height)] sm:max-h-[calc(100dvh-5rem)] sm:min-h-[560px] sm:min-w-[420px] sm:w-[var(--texise-ai-width)] sm:max-w-[calc(100vw-2rem)] sm:resize sm:transition-none ${desktopFrameClass(size)}`}"
    },
    {
      "path": "packages/core/app/src/components/ai-conversation-shell.tsx",
      "line": 215,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-ai-overlay\""
    },
    {
      "path": "packages/core/app/src/components/ai-conversation-shell.tsx",
      "line": 257,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<aside className=\"hidden min-h-0 w-[min(340px,32vw)] shrink-0 overflow-y-auto border-l bg-muted/10 p-3 sm:block\" data-testid=\"texise-ai-evidence-pane\">"
    },
    {
      "path": "packages/core/app/src/components/ai-provider-model-select.tsx",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CUSTOM_MODEL_VALUE = '__texise_custom_model__';"
    },
    {
      "path": "packages/core/app/src/components/ai-review-dialog.tsx",
      "line": 206,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "// Review artifacts intentionally live below hidden `.texise/` and are"
    },
    {
      "path": "packages/core/app/src/components/ai-settings-events.ts",
      "line": 1,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const AI_SETTINGS_OPEN_EVENT = 'texise:open-ai-settings';"
    },
    {
      "path": "packages/core/app/src/components/ai-settings-events.ts",
      "line": 2,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const AI_SETTINGS_SAVED_EVENT = 'texise:ai-settings-saved';"
    },
    {
      "path": "packages/core/app/src/components/ai-settings-events.ts",
      "line": 3,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const AI_SETTINGS_CLOSED_EVENT = 'texise:ai-settings-closed';"
    },
    {
      "path": "packages/core/app/src/components/citation-picker-dialog.tsx",
      "line": 48,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const PROVIDER_SETTINGS_KEY = 'texise:reference-providers:v1';"
    },
    {
      "path": "packages/core/app/src/components/citation-picker-dialog.tsx",
      "line": 49,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const SHORTLIST_KEY_PREFIX = 'texise:reference-shortlist:v2:';"
    },
    {
      "path": "packages/core/app/src/components/citation-picker-dialog.tsx",
      "line": 50,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LEGACY_SHORTLIST_KEY_PREFIX = 'texise:reference-shortlist:v1:';"
    },
    {
      "path": "packages/core/app/src/components/clone-git-repository-dialog.tsx",
      "line": 138,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-clone-workspace\">{t.app.git.cloneWorkspaceName}</Label>"
    },
    {
      "path": "packages/core/app/src/components/clone-git-repository-dialog.tsx",
      "line": 140,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-clone-workspace\""
    },
    {
      "path": "packages/core/app/src/components/clone-git-repository-dialog.tsx",
      "line": 147,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-clone-url\">{t.app.git.remoteUrl}</Label>"
    },
    {
      "path": "packages/core/app/src/components/clone-git-repository-dialog.tsx",
      "line": 149,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-clone-url\""
    },
    {
      "path": "packages/core/app/src/components/clone-git-repository-dialog.tsx",
      "line": 157,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-clone-token\">{t.app.git.token}</Label>"
    },
    {
      "path": "packages/core/app/src/components/clone-git-repository-dialog.tsx",
      "line": 159,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-clone-token\""
    },
    {
      "path": "packages/core/app/src/components/clone-git-repository-dialog.tsx",
      "line": 168,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-clone-proxy\">{t.app.git.corsProxy}</Label>"
    },
    {
      "path": "packages/core/app/src/components/clone-git-repository-dialog.tsx",
      "line": 170,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-clone-proxy\""
    },
    {
      "path": "packages/core/app/src/components/common/__tests__/asset-preview.spec.tsx",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const OBJECT_URL = 'blob:https://texise.test/asset';"
    },
    {
      "path": "packages/core/app/src/components/common/page-header.tsx",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "alt={t.app.common.texiseLogoAlt}"
    },
    {
      "path": "packages/core/app/src/components/compile-panel.tsx",
      "line": 222,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className=\"texise-compile-primary h-7 gap-1.5 px-2 sm:px-2.5\""
    },
    {
      "path": "packages/core/app/src/components/compiler-diagnostics-list.tsx",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"border-b bg-background\" aria-label={t.app.compile.diagnostics} data-testid=\"texise-compiler-diagnostics\">"
    },
    {
      "path": "packages/core/app/src/components/floating-research-dock.tsx",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-research-dock\""
    },
    {
      "path": "packages/core/app/src/components/floating-research-dock.tsx",
      "line": 43,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-ai-open\""
    },
    {
      "path": "packages/core/app/src/components/git-panel.tsx",
      "line": 3,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_AUTHOR_EMAIL_STORAGE_KEY,"
    },
    {
      "path": "packages/core/app/src/components/git-panel.tsx",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_AUTHOR_NAME_STORAGE_KEY,"
    },
    {
      "path": "packages/core/app/src/components/git-panel.tsx",
      "line": 67,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const [authorName, setAuthorName] = useLocalSetting(TEXISE_GIT_AUTHOR_NAME_STORAGE_KEY);"
    },
    {
      "path": "packages/core/app/src/components/git-panel.tsx",
      "line": 69,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_AUTHOR_EMAIL_STORAGE_KEY,"
    },
    {
      "path": "packages/core/app/src/components/git-panel.tsx",
      "line": 696,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-git-token\">{t.app.git.token}</Label>"
    },
    {
      "path": "packages/core/app/src/components/git-panel.tsx",
      "line": 697,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Input id=\"texise-git-token\" type=\"password\" autoComplete=\"off\" value={token} onChange={(event) => setToken(event.currentTarget.value)} />"
    },
    {
      "path": "packages/core/app/src/components/git-panel.tsx",
      "line": 699,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-git-proxy\">{t.app.git.corsProxy}</Label>"
    },
    {
      "path": "packages/core/app/src/components/git-panel.tsx",
      "line": 700,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Input id=\"texise-git-proxy\" value={corsProxy} onChange={(event) => setCorsProxy(event.currentTarget.value)} />"
    },
    {
      "path": "packages/core/app/src/components/latex-source-editor.tsx",
      "line": 66,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "import { TexisePluginToolbar } from './texise-plugin-toolbar';"
    },
    {
      "path": "packages/core/app/src/components/latex-source-editor.tsx",
      "line": 81,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const TOOLBAR_STORAGE_KEY = 'texise:latex-source:toolbar';"
    },
    {
      "path": "packages/core/app/src/components/latex-source-editor.tsx",
      "line": 1623,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className=\"texise-visual-selection-toolbar\""
    },
    {
      "path": "packages/core/app/src/components/latex-source-editor.tsx",
      "line": 1633,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className=\"texise-visual-selection-button texise-ai-selection-button gap-1\""
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 280,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const VISUAL_ASSET_ERROR_PREFIX = 'texise-asset-error:';"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3132,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "element.classList.remove('texise-visual-comment-anchor', 'texise-visual-comment-resolved', 'texise-visual-comment-outdated', 'texise-visual-change-anchor', 'texise-visual-change-insert', 'texise-visual-change-delete', 'texise-visual-change-replace');"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3142,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "element.classList.add('texise-visual-comment-anchor');"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3144,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "element.classList.add('texise-visual-change-anchor', `texise-visual-change-${decoration.changeType ?? 'replace'}`);"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3146,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (decoration.status === 'resolved') element.classList.add('texise-visual-comment-resolved');"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3147,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (decoration.status === 'outdated') element.classList.add('texise-visual-comment-outdated');"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3760,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-footnote-text\">"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3764,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-footnote-text\""
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3815,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-visual-caption\">"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3819,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-visual-caption\""
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3826,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-visual-figure-width\">"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3830,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-visual-figure-width\""
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3836,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-visual-figure-height\">"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3840,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-visual-figure-height\""
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3846,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-visual-figure-scale\">{t.app.bibliography.scale}</Label>"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3848,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-visual-figure-scale\""
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3872,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-visual-figure-description\">"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3876,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-visual-figure-description\""
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3917,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-visual-environment-placement\">{t.app.bibliography.placement}</Label>"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3919,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-visual-environment-placement\""
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3920,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid={metadataSession?.block.kind === 'figure' ? 'texise-visual-figure-placement' : 'texise-visual-table-placement'}"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3926,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-visual-label\">{t.app.bibliography.label}</Label>"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3928,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-visual-label\""
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3938,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<details className=\"rounded-md border p-3\" data-testid=\"texise-visual-table-advanced\">"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3941,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-visual-table-import\">{t.app.bibliography.tableImport}</Label>"
    },
    {
      "path": "packages/core/app/src/components/latex-visual-editor.tsx",
      "line": 3943,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-visual-table-import\""
    },
    {
      "path": "packages/core/app/src/components/page-modal-service.tsx",
      "line": 116,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<DialogContent className=\"sm:max-w-md\" aria-describedby=\"texise-page-modal-description\">"
    },
    {
      "path": "packages/core/app/src/components/page-modal-service.tsx",
      "line": 119,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{active.description ? <DialogDescription id=\"texise-page-modal-description\">{active.description}</DialogDescription> : null}"
    },
    {
      "path": "packages/core/app/src/components/page-modal-service.tsx",
      "line": 132,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-page-modal-input\">{active.label}</Label>"
    },
    {
      "path": "packages/core/app/src/components/page-modal-service.tsx",
      "line": 134,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-page-modal-input\""
    },
    {
      "path": "packages/core/app/src/components/paper-memory-panel.tsx",
      "line": 639,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"relative flex min-h-0 flex-1 flex-col overflow-hidden\" data-testid=\"texise-paper-memory\">"
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 293,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "span.dataset.texiseTextIndex = String(index);"
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 395,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "span.classList.remove('texise-pdf-search-hit', 'texise-pdf-search-active');"
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 404,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "span.classList.add('texise-pdf-search-hit');"
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 410,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "span.classList.add('texise-pdf-search-active');"
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 860,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className=\"textLayer texise-pdf-text-layer absolute inset-0 z-10 cursor-text select-text overflow-hidden\""
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 1533,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-pdf-preview\""
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 1539,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-output-tabs\""
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 1565,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-log-status-dot\""
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 1603,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"flex min-h-11 shrink-0 flex-wrap items-center gap-1 border-b bg-background px-2 py-1\" data-testid=\"texise-pdf-toolbar\">"
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 1873,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"flex min-h-0 flex-1 flex-col bg-background\" data-testid=\"texise-compile-log\">"
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 1921,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-compile-performance\""
    },
    {
      "path": "packages/core/app/src/components/pdf-preview-pane.tsx",
      "line": 1947,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<details className=\"border-b bg-muted/10\" data-testid=\"texise-generated-artifacts\">"
    },
    {
      "path": "packages/core/app/src/components/pro-license-dialog.tsx",
      "line": 68,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<DialogContent className=\"sm:max-w-md\" data-testid=\"texise-pro-dialog\">"
    },
    {
      "path": "packages/core/app/src/components/pro-license-dialog.tsx",
      "line": 117,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<Label htmlFor=\"texise-pro-key\">{t.app.pro.licenseKey}</Label>"
    },
    {
      "path": "packages/core/app/src/components/pro-license-dialog.tsx",
      "line": 119,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-pro-key\""
    },
    {
      "path": "packages/core/app/src/components/pro-license-dialog.tsx",
      "line": 122,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "placeholder=\"TEXISE-PRO-…\""
    },
    {
      "path": "packages/core/app/src/components/project-outline-panel.tsx",
      "line": 79,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<aside className=\"flex w-72 shrink-0 flex-col border-r bg-muted/10\" data-testid=\"texise-project-outline\">"
    },
    {
      "path": "packages/core/app/src/components/project-template-dialog.tsx",
      "line": 107,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const handle = await pickDirectory({ id: 'texise-template-workspace' });"
    },
    {
      "path": "packages/core/app/src/components/project-template-dialog.tsx",
      "line": 184,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<DialogContent className=\"max-h-[85vh] overflow-y-auto sm:max-w-3xl\" data-testid=\"texise-template-dialog\">"
    },
    {
      "path": "packages/core/app/src/components/project-template-dialog.tsx",
      "line": 203,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-template-search\">Find a template</Label>"
    },
    {
      "path": "packages/core/app/src/components/project-template-dialog.tsx",
      "line": 204,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Input id=\"texise-template-search\" value={templateQuery} onChange={(event) => setTemplateQuery(event.currentTarget.value)} placeholder=\"Search by name or category…\" />"
    },
    {
      "path": "packages/core/app/src/components/project-template-dialog.tsx",
      "line": 241,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-template-name\">{t.app.templates.workspaceName}</Label>"
    },
    {
      "path": "packages/core/app/src/components/project-template-dialog.tsx",
      "line": 243,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id=\"texise-template-name\""
    },
    {
      "path": "packages/core/app/src/components/project-tools-dialog.tsx",
      "line": 392,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<DialogContent className=\"flex max-h-[86vh] flex-col sm:max-w-4xl\" data-testid=\"texise-project-tools-dialog\">"
    },
    {
      "path": "packages/core/app/src/components/project-tools-dialog.tsx",
      "line": 420,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"space-y-3\" data-testid=\"texise-project-text-search\">"
    },
    {
      "path": "packages/core/app/src/components/project-tools-dialog.tsx",
      "line": 526,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"space-y-3\" data-testid=\"texise-project-symbol-search\">"
    },
    {
      "path": "packages/core/app/src/components/project-tools-dialog.tsx",
      "line": 558,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"space-y-3\" data-testid=\"texise-project-meaning-search\">"
    },
    {
      "path": "packages/core/app/src/components/project-tools-dialog.tsx",
      "line": 667,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"space-y-3\" data-testid=\"texise-research-review\">"
    },
    {
      "path": "packages/core/app/src/components/project-tools-dialog.tsx",
      "line": 714,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-refactor-from\">{refactorKind === 'file' ? t.app.projectTools.currentPath : t.app.projectTools.currentName}</Label>"
    },
    {
      "path": "packages/core/app/src/components/project-tools-dialog.tsx",
      "line": 715,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Input id=\"texise-refactor-from\" value={fromValue} onChange={(event) => setFromValue(event.currentTarget.value)} />"
    },
    {
      "path": "packages/core/app/src/components/project-tools-dialog.tsx",
      "line": 716,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Label htmlFor=\"texise-refactor-to\">{refactorKind === 'file' ? t.app.projectTools.newPath : t.app.projectTools.newName}</Label>"
    },
    {
      "path": "packages/core/app/src/components/project-tools-dialog.tsx",
      "line": 717,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<Input id=\"texise-refactor-to\" value={toValue} onChange={(event) => setToValue(event.currentTarget.value)} />"
    },
    {
      "path": "packages/core/app/src/components/project-zip-actions.tsx",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return `${normalized || 'texise-project'}.zip`;"
    },
    {
      "path": "packages/core/app/src/components/project-zip-actions.tsx",
      "line": 128,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise:last-project-export:${workspaceName}`,"
    },
    {
      "path": "packages/core/app/src/components/project-zip-actions.tsx",
      "line": 178,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise:last-project-export:${workspaceName}`,"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 49,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (kind === 'empty') return <span className=\"texise-code-empty\">&nbsp;</span>;"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 50,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (kind === 'comment') return <span className=\"texise-code-comment\">{text}</span>;"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 51,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (kind === 'equation') return <span className=\"texise-code-equation\">{text}</span>;"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 56,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <><span className=\"texise-code-command\">{match[1]}</span><span className=\"texise-code-dim\">{match[2]}</span></>;"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 61,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-source-preview\" data-hero-editor-mode=\"source\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 62,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-editor-tabs\"><span className=\"is-active\">main.tex</span><span>×</span></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 63,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-code\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 64,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-line-numbers\">{sourceLines.map((line) => <span key={`line-${line.number}`}>{line.number}</span>)}</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 65,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-code-content\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 69,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-source-status\"><span>Ln 24, Col 8</span><span>LaTeX</span><span>UTF-8</span></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 76,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-preview\" data-hero-editor-mode=\"visual\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 77,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-editor-tabs\"><span className=\"is-active\">main.tex · Visual</span><span>×</span></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 78,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-document\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 79,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-title\">Local First Scientific Writing</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 80,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-author\">Research Team</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 81,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-block\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 82,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-heading\">Abstract</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 85,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-block is-hovered\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 86,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-hero-visual-handle\" aria-hidden=\"true\">⋮⋮</span>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 87,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-heading\">1 Introduction</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 90,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-block\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 91,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-heading\">2 Method</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 93,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-equation\">E = mc<sup>2</sup></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 95,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-block\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 96,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-visual-heading\">3 Results</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 97,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<p>The manuscript remains editable while the preview updates from the same canonical source <span className=\"texise-hero-visual-citation\">[1]</span>.</p>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 100,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-source-status\"><span>Visual editor</span><span>Source-safe</span><span>main.tex</span></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 107,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className={`texise-hero-workspace-pdf${compileState === 'compiling' ? ' is-compiling' : ''}${compileState === 'compiled' ? ' is-compiled' : ''}`}>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 108,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-pdf-toolbar\"><span>1 / 1</span><span>100%</span><span>⌕</span><span>↓</span></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 109,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-pdf-canvas\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 111,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-compile-loader\" role=\"status\" aria-live=\"polite\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 112,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-hero-spinner\" aria-hidden=\"true\" />"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 117,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-pdf-page\" data-pdf-revision={revision}>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 118,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-paper-title\">Local First Scientific Writing</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 119,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-paper-author\">Research Team</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 120,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-paper-rule\" />"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 121,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-paper-heading\">Abstract</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-paper-heading\">1 &nbsp; Introduction</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 125,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-paper-heading\">2 &nbsp; Method</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 127,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-paper-equation\">E = mc<sup>2</sup></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 128,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-paper-heading\">3 &nbsp; Results</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 130,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{revision > 0 ? <div className=\"texise-hero-paper-compiled\">Updated just now</div> : null}"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 131,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-paper-page-number\">1</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 141,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-terminal\" data-hero-terminal=\"open\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 142,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-terminal-header\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 143,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><span className=\"texise-hero-terminal-icon\" aria-hidden=\"true\">›_</span><strong>TERMINAL</strong><span>Browser local</span></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 144,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<button type=\"button\" className=\"texise-hero-terminal-close\" onClick={onClose} aria-label=\"Close simulated Terminal\">×</button>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 146,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-terminal-body\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 147,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><span className=\"texise-terminal-prompt\">$</span> python analysis.py</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 148,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-terminal-muted\">Loading observations.csv...</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 152,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-terminal-success\">Analysis complete.</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 153,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><span className=\"texise-terminal-prompt\">$</span> <span className=\"texise-terminal-caret\" aria-hidden=\"true\" /></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 288,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-hero-workspace',"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 295,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-workspace-wrap\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 297,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-workspace-titlebar\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 298,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-workspace-title\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 299,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<img src=\"/favicon.svg\" alt=\"\" className=\"texise-hero-workspace-favicon\" />"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 301,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-hero-workspace-saved\">Saved locally</span>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 303,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-workspace-title-actions\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 304,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<button type=\"button\" className={`texise-hero-workspace-compile${compileState === 'compiled' ? ' is-compiled' : ''}`} onClick={startCompile} disabled={compileState === 'compiling'}>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 305,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{compileState === 'compiling' ? <span className=\"texise-hero-spinner is-small\" aria-hidden=\"true\" /> : <span className=\"texise-hero-play\" aria-hidden=\"true\">{compileIcon}</span>}"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 308,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-hero-static-action\" aria-hidden=\"true\">Share</span>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 312,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-workspace-toolbar\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 313,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-workspace-tabs\" role=\"group\" aria-label=\"Simulated editor mode\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 318,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-workspace-tools\" aria-hidden=\"true\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 325,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-workspace-pdf-label\">PDF</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 328,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-workspace-grid\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 329,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<aside className=\"texise-hero-workspace-files\" aria-hidden=\"true\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 330,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-pane-heading\">PROJECT</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 331,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-file is-active\"><span>▾</span><strong>main.tex</strong></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 332,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-file\"><span>·</span>references.bib</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 333,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-file\"><span>▸</span>figures</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 334,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-file\"><span>▸</span>analysis</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 335,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-file\"><span>·</span>notes.md</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 336,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-files-spacer\" />"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 337,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-file-status\"><span className=\"texise-hero-status-dot\" />Local project</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 340,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className={`texise-hero-workspace-source${terminalOpen ? ' is-terminal-open' : ''}`}>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 341,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div ref={comparisonRef} className=\"texise-hero-editor-compare\" data-hero-reveal-percent={revealPercent.toFixed(1)}>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 342,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-editor-layer texise-hero-editor-layer-visual\"><HeroVisualPreview /></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 343,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-editor-layer texise-hero-editor-layer-source\" style={{ clipPath: `polygon(0 0, ${revealPercent}% 0, ${revealPercent}% 100%, 0 100%)` }}><HeroSourcePreview /></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 344,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-hero-reveal-label is-source\" aria-hidden=\"true\">SOURCE</span>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 345,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-hero-reveal-label is-visual\" aria-hidden=\"true\">VISUAL</span>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 346,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-reveal-divider\" style={{ left: `${revealPercent}%` }} aria-hidden=\"true\" />"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 348,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className={`texise-hero-reveal-handle${isDraggingReveal ? ' is-dragging' : ''}`}"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 378,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-workspace-bottom\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 379,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div aria-hidden=\"true\"><span className=\"texise-hero-status-dot is-yellow\" />Ready</div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 380,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-bottom-actions\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/hero-workspace-preview.tsx",
      "line": 381,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<button type=\"button\" className=\"texise-hero-terminal-trigger\" aria-pressed={terminalOpen} onClick={() => { setTerminalOpen((open) => !open); delayAutoReveal(); }}><span aria-hidden=\"true\">›_</span>Terminal</button>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-feature-showcase.tsx",
      "line": 94,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<article className=\"texise-why-card\" style={{ '--texise-why-delay': `${index * 45}ms` } as React.CSSProperties}>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-feature-showcase.tsx",
      "line": 95,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-why-card-pin\" aria-hidden=\"true\"><Icon className=\"size-5\" /></div>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-feature-showcase.tsx",
      "line": 105,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-why-section\" aria-labelledby=\"texise-why-title\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-feature-showcase.tsx",
      "line": 106,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-why-heading\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-feature-showcase.tsx",
      "line": 107,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Why Learnitive?</span>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-feature-showcase.tsx",
      "line": 108,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h2 id=\"texise-why-title\">Built Awesome</h2>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-feature-showcase.tsx",
      "line": 111,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-why-grid\" data-texise-why-primary=\"true\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-feature-showcase.tsx",
      "line": 116,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div id=\"texise-why-more\" className=\"texise-why-grid texise-why-grid-more\" data-texise-why-more=\"true\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-feature-showcase.tsx",
      "line": 123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className=\"texise-why-toggle\""
    },
    {
      "path": "packages/core/app/src/components/public-home/home-feature-showcase.tsx",
      "line": 125,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "aria-controls=\"texise-why-more\""
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 6,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-home-capability-check\" aria-hidden=\"true\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<svg className=\"texise-home-hero-formulas\" viewBox=\"0 0 1200 860\" preserveAspectRatio=\"xMidYMid slice\" aria-hidden=\"true\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 19,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<pattern id=\"texise-home-formula-pattern\" x=\"0\" y=\"0\" width=\"360\" height=\"190\" patternUnits=\"userSpaceOnUse\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<text className=\"texise-home-formula-accent\" x=\"82\" y=\"151\">θ</text>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 28,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "<rect width=\"100%\" height=\"100%\" fill=\"url(#texise-home-formula-pattern)\" />"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-home-hero-v2\" aria-labelledby=\"texise-home-hero-title\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 36,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-home-hero-grid\" aria-hidden=\"true\" />"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 38,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-page-container texise-home-hero-inner\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 39,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<p className=\"texise-home-hero-eyebrow\">Local-first development · real Ubuntu · universal runtime.</p>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 41,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h1 id=\"texise-home-hero-title\" className=\"texise-home-hero-title\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 42,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "Learnitive — Build locally.<span className=\"texise-home-hero-privacy\">Run anywhere<svg viewBox=\"0 0 180 12\" preserveAspectRatio=\"none\" aria-hidden=\"true\"><path d=\"M3 6c12-4 20 4 32 0s20 4 32 0 20 4 32 0 20 4 32 0 20 4 46 0\" /></svg></span>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 45,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-home-hero-actions\" role=\"group\" aria-label=\"Learnitive workspace and Pro actions\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 46,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<a className=\"texise-button texise-button-primary texise-home-hero-action\" href=\"/projects\">Open Workspace</a>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 47,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{shopUrl ? <a className=\"texise-button texise-button-secondary texise-home-hero-action texise-home-hero-buy\" href={shopUrl} rel=\"noreferrer\">Buy Pro $29</a> : <span className=\"texise-button texise-button-secondary texise-home-hero-action texise-home-hero-buy is-disabled\" aria-disabled=\"true\">Buy Pro $29</span>}"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 52,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<p className=\"texise-home-hero-description\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-hero.tsx",
      "line": 56,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-home-capabilities\" role=\"group\" aria-label=\"Learnitive capabilities\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-workflows-showcase.tsx",
      "line": 44,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-home-workflows\" aria-labelledby=\"texise-home-workflows-title\" data-home-section=\"explore-learnitive\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-workflows-showcase.tsx",
      "line": 45,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-home-workflows-heading\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-workflows-showcase.tsx",
      "line": 46,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">IDE · Runtime · AI · Learn</span>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-workflows-showcase.tsx",
      "line": 47,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h2 id=\"texise-home-workflows-title\">Build around the project you already own</h2>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-workflows-showcase.tsx",
      "line": 50,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-home-workflow-list\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-workflows-showcase.tsx",
      "line": 52,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<article className=\"texise-home-workflow-card\" key={workflow.title}>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-workflows-showcase.tsx",
      "line": 53,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-home-workflow-copy\">"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-workflows-showcase.tsx",
      "line": 54,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-home-workflow-eyebrow\">{workflow.eyebrow}</span>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-workflows-showcase.tsx",
      "line": 56,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<strong className=\"texise-home-workflow-subtitle\">{workflow.subtitle}</strong>"
    },
    {
      "path": "packages/core/app/src/components/public-home/home-workflows-showcase.tsx",
      "line": 58,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<p className=\"texise-home-workflow-capabilities\">{workflow.capabilities.join(' · ')}</p>"
    },
    {
      "path": "packages/core/app/src/components/tikz-visual-editor.tsx",
      "line": 28,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "| { source: 'texise-tikz-draw'; type: 'ready' }"
    },
    {
      "path": "packages/core/app/src/components/tikz-visual-editor.tsx",
      "line": 29,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "| { source: 'texise-tikz-draw'; type: 'insert'; payload: TikzDrawPayload };"
    },
    {
      "path": "packages/core/app/src/components/tikz-visual-editor.tsx",
      "line": 34,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (message.source !== 'texise-tikz-draw') return false;"
    },
    {
      "path": "packages/core/app/src/components/toast-blog-editor.tsx",
      "line": 102,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <div className=\"texise-toast-editor\" ref={hostRef} />;"
    },
    {
      "path": "packages/core/app/src/dialogs/create-workspace-dialog.tsx",
      "line": 85,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const legacy = localStorage.getItem('texise:preferred-project-storage');"
    },
    {
      "path": "packages/core/app/src/editor-preferences.ts",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LEGACY_LATEX_WORD_WRAP_STORAGE_KEY = 'texise:latex-source:soft-wrap';"
    },
    {
      "path": "packages/core/app/src/editor-preferences.ts",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LEGACY_LATEX_LINE_NUMBERS_STORAGE_KEY = 'texise:latex-source:line-numbers';"
    },
    {
      "path": "packages/core/app/src/editor-preferences.ts",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LEGACY_LATEX_FONT_SIZE_STORAGE_KEY = 'texise:latex-source:font-size';"
    },
    {
      "path": "packages/core/app/src/editor-preferences.ts",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LEGACY_LATEX_SPELLCHECK_STORAGE_KEY = 'texise:latex-source:spellcheck';"
    },
    {
      "path": "packages/core/app/src/layout/app-header.tsx",
      "line": 48,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"desktop-titlebar-drag desktop-titlebar-surface texise-ws-header flex h-[var(--texise-app-titlebar-height)] max-h-[var(--texise-app-titlebar-height)] min-h-[var(--texise-app-titlebar-height)] shrink-0 items-center gap-2 overflow-hidden px-3\">"
    },
    {
      "path": "packages/core/app/src/layout/app-header.tsx",
      "line": 130,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<a className=\"texise-ws-brand\" href=\"/projects\" aria-label=\"Learnitive projects\"><img src=\"/learnitive-logo-mobile.png\" alt=\"\" /><strong>Learnitive</strong></a>"
    },
    {
      "path": "packages/core/app/src/pages/__tests__/page-settings.spec.tsx",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'texise://app/#route=settings-general',"
    },
    {
      "path": "packages/core/app/src/pages/__tests__/page-settings.spec.tsx",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "safeAppHref('/\\\\evil.example/path', 'texise://app/'),"
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 46,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const EDITOR_PDF_SPLIT_STORAGE_KEY = 'texise:editor-pdf-split:v2';"
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 82,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "testId = 'texise-editor-pdf-resizer',"
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 165,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className={`latex-bedrive-resizer texise-drive-browser-editor-resizer hidden lg:flex${isDragging ? ' is-dragging' : ''}`}"
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 637,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "document.querySelector<HTMLElement>('[data-testid=\"texise-pdf-preview\"]')?.focus();"
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 708,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-split-workspace\""
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 717,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-editor-pane\""
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 720,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className=\"texise-editor-toolbar flex shrink-0 items-center gap-1 border-b bg-background px-2 py-1.5\""
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 721,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-editor-toolbar\""
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 917,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-texise-latex-view=\"source\""
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 950,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-texise-latex-view=\"visual\""
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 966,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-texise-latex-view=\"visual\""
    },
    {
      "path": "packages/core/app/src/pages/page-editor.tsx",
      "line": 1042,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-output-pane\""
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LEGACY_TRY_PREFIX = 'texise:learn-example:';"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 126,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.sourceType==='wistia')return <figure className=\"texise-learn-video\"><div className=\"texise-learn-video-frame\">{React.createElement('wistia-player',{'media-id':block.externalVideoId,style:{width:'100%',aspectRatio:'16 / 9'}})}</div>{block.title?<strong>{block.title}</strong>:null}{block.caption?<figcaption>{block.caption}</figcaption>:null}</figure>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 127,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <figure className=\"texise-learn-video\" ref={host}>{block.sourceType==='youtube'?<div className=\"texise-learn-video-frame\"><div data-plyr-target data-plyr-provider=\"youtube\" data-plyr-embed-id={block.externalVideoId}/></div>:<div className=\"texise-learn-video-frame\"><video data-plyr-target controls playsInline preload=\"metadata\" poster={block.poster||undefined}><source src={block.src} />{block.captionSrc?<track kind=\"captions\" src={block.captionSrc} srcLang=\"en\" label=\"Captions\" default/>:"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 133,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(html)return <section className=\"texise-learn-block texise-learn-block-solution\"><strong>Solution</strong><div className=\"texise-prose\" dangerouslySetInnerHTML={{__html:html}}/></section>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 134,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-learn-block texise-learn-block-solution\"><strong>Solution</strong><p>Reveal the solution when you are ready.</p><button type=\"button\" className=\"texise-button texise-button-secondary\" disabled={!courseSlug||!lessonSlug||busy} onClick={()=>void reveal()}>{busy?'Loading…':'Show solution'}</button>{error?<small>{error}</small>:null}</section>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 145,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <div className=\"texise-learn-blocks\">{blocks.map((block)=>{"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 147,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(['rich-text','hint','summary'].includes(block.type)){const rich=block as Extract<LearnContentBlock,{type:'rich-text'|'hint'|'summary'}>;return <section key={block.id} className={`texise-learn-block texise-learn-block-${block.type}`} dangerouslySetInnerHTML={{__html:rich.html||''}}/>}"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 149,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='callout')return <aside key={block.id} className={`texise-learn-callout is-${block.tone}`}>{block.text}</aside>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 150,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='code-sample')return <pre key={block.id} className=\"texise-learn-code\"><code>{block.code}</code></pre>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 151,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='image')return <figure key={block.id} className=\"texise-learn-media\"><img src={block.src} alt={block.alt}/>{block.caption?<figcaption>{block.caption}</figcaption>:null}</figure>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 153,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='interactive-editor')return <React.Fragment key={block.id}>{renderExercise?renderExercise(block):<section className=\"texise-learn-callout is-info\"><strong>{block.title||'Interactive editor'}</strong><p>{block.instructions}</p></section>}</React.Fragment>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 154,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='exercise')return <React.Fragment key={block.id}>{renderExercise?renderExercise():<section className=\"texise-learn-callout is-info\"><strong>Interactive exercise</strong><p>Open the lesson workspace to complete this exercise.</p></section>}</React.Fragment>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 155,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='quiz')return <React.Fragment key={block.id}>{renderQuiz?renderQuiz():<section className=\"texise-learn-callout is-info\"><strong>Quiz</strong><p>The lesson quiz appears here for learners.</p></section>}</React.Fragment>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 165,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(lesson.locked)return <div className=\"texise-learn-lock\"><LockKeyhole className=\"size-5\"/><div><strong>Locked for this preview tier.</strong><p>The protected lesson body and video configuration are not returned.</p></div></div>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 166,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <><>{lesson.contentHtml?<div className=\"texise-prose texise-learn-content\" dangerouslySetInnerHTML={{__html:lesson.contentHtml}}/>:null}</><LearnContentBlocks blocks={lesson.contentBlocks||[]} courseSlug={lesson.course?.slug} lessonSlug={lesson.slug} renderQuiz={renderQuiz} renderExercise={renderExercise}/></>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 170,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <a className=\"texise-learn-course-card\" href={course.lastLessonSlug&&course.progressPercent>0&&course.progressPercent<100?`/learn/${encodeURIComponent(course.slug)}/${encodeURIComponent(course.lastLessonSlug)}`:`/learn/${encodeURIComponent(course.slug)}`}>"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 171,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{course.coverImageUrl?<div className=\"texise-learn-course-cover\"><img src={course.coverImageUrl} alt=\"\" loading={course.featured?'eager':'lazy'}/></div>:null}"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 172,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-card-meta\"><span>{modeLabel(course.projectModeId)}</span><span>{course.level}</span>{course.accessTier === 'pro' ? <span className=\"texise-learn-pro\"><Crown className=\"size-3\" /> Pro</span> : <span>Free</span>}</div>"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 175,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-learn-course-foot\"><span><BookOpen className=\"size-4\" /> {course.lessonCount} lessons</span><span><Clock3 className=\"size-4\" /> {minutesLabel(course.estimatedMinutes)}</span><ChevronRight className=\"size-4\" /></div>"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 176,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{course.progressPercent > 0 ? <div className=\"texise-learn-course-progress\"><span style={{width:`${course.progressPercent}%`}}/><small>{course.progressPercent}% complete</small></div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 196,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-page-container texise-page-heading texise-learn-heading\"><span className=\"texise-eyebrow\">Interactive learning</span><h1 className=\"texise-display\">Learn by building.</h1><p>Interactive courses for code, web development, Markdown and LaTeX. Free courses stay open; Pro courses unlock deeper guided practice.</p></header>"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 197,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-learn-filters\" aria-label=\"Course filters\"><input type=\"search\" value={query} onChange={(e)=>setQuery(e.currentTarget.value)} placeholder=\"Search courses and lessons\" aria-label=\"Search courses and lessons\"/><select value={language} onChange={(e)=>setLanguage(e.currentTarget.value)}><option value=\"\">All languages</option>{languages.map((item)=><option key={item} value={item}>{item}</option>)}</select><select value={framework} onChange={(e)=>setFra"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 198,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{error?<section className=\"texise-page-container\"><div className=\"texise-error-notice\">{error}</div></section>:null}"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 199,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{continueCourses.length?<section className=\"texise-page-container texise-learn-section\"><div className=\"texise-section-heading\"><span className=\"texise-eyebrow\">Continue learning</span><h2>Pick up where you left off</h2></div><div className=\"texise-learn-course-grid\">{continueCourses.map((course)=><CourseCard key={course.slug} course={course}/>)}</div></section>:null}"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 200,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{featured.length?<section className=\"texise-page-container texise-learn-section\"><div className=\"texise-section-heading\"><span className=\"texise-eyebrow\">Featured courses</span><h2>Start with a guided path</h2></div><div className=\"texise-learn-course-grid\">{featured.map((course)=><CourseCard key={course.slug} course={course}/>)}</div></section>:null}"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 201,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-learn-section\"><div className=\"texise-section-heading\"><span className=\"texise-eyebrow\">Course catalog</span><h2>Explore all courses</h2></div>{loading?<p>Loading courses…</p>:<div className=\"texise-learn-course-grid\">{filtered.map((course)=><CourseCard key={course.slug} course={course}/>)}</div>}</section>"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 208,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(error)return <section className=\"texise-page-container texise-page-heading\"><h1>Course unavailable</h1><p>{error}</p><a className=\"texise-text-link\" href=\"/learn\">← Back to Learn</a></section>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 209,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(!course)return <section className=\"texise-page-container texise-page-heading\"><p>Loading course…</p></section>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 211,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-page-container texise-page-heading texise-learn-course-heading\"><a className=\"texise-text-link\" href=\"/learn\">← Learn</a>{course.coverImageUrl?<div className=\"texise-learn-course-hero-cover\"><img src={course.coverImageUrl} alt=\"\" loading=\"eager\"/></div>:null}<div className=\"texise-card-meta\"><span>{modeLabel(course.projectModeId)}</span><span>{course.level}</span><span>{minutesLabel(course.estimatedMinutes)}</span>{course.accessTier==='pro'?<span className=\"texise-learn"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 212,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{!course.locked&&course.descriptionHtml?<section className=\"texise-page-container texise-prose texise-learn-description\" dangerouslySetInnerHTML={{__html:course.descriptionHtml}}/>:null}"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 213,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-learn-outline\"><h2>Course outline</h2>{course.modules.map((module)=><article key={module.id}><div><h3>{module.title}</h3>{module.description?<p>{module.description}</p>:null}</div><div>{module.lessons.map((lesson)=><a key={lesson.id} href={`/learn/${encodeURIComponent(course.slug)}/${encodeURIComponent(lesson.slug)}`} className={lesson.locked?'is-locked':''}><span>{lesson.completed?<Check className=\"size-4\"/>:lesson.locked?<LockKeyhole className=\""
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 235,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-learn-quiz\" aria-labelledby=\"learn-quiz-question\"><div className=\"texise-learn-quiz-title\"><Sparkles className=\"size-5\"/><div><strong>Quick check</strong><p id=\"learn-quiz-question\">{exercise.question}</p></div></div><div className=\"texise-learn-quiz-options\">{exercise.options.map((option,index)=><label key={`${index}-${option}`}><input type=\"radio\" name={`quiz-${lessonSlug}`} checked={selected===index} onChange={()=>{setSelected(index);setResult(undefined)}}/><"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 243,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(error&&!lesson)return <section className=\"texise-page-container texise-page-heading\"><h1>Lesson unavailable</h1><p>{error}</p><a className=\"texise-text-link\" href={`/learn/${encodeURIComponent(courseSlug)}`}>← Course</a></section>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 244,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(!lesson)return <section className=\"texise-page-container texise-page-heading\"><p>Loading lesson…</p></section>;"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 245,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(lesson.locked)return <section className=\"texise-page-container texise-page-heading\"><a className=\"texise-text-link\" href={`/learn/${encodeURIComponent(courseSlug)}`}>← {lesson.course.title}</a><span className=\"texise-eyebrow\">Pro lesson</span><h1>{lesson.title}</h1><div className=\"texise-learn-lock\"><LockKeyhole className=\"size-5\"/><div><strong>This lesson requires Pro.</strong><p>Upgrade to open the lesson body and exercise workspace.</p><a className=\"texise-button texise-button-primary\" hre"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 247,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const renderWorkspace=(block?:Extract<LearnContentBlock,{type:'interactive-editor'}>)=>lesson.starter?<section className=\"texise-learn-interactive-card\"><div><Code2 className=\"size-5\"/><div><strong>{block?.title||'Interactive workspace'}</strong><p>{block?.instructions||'Open this lesson starter in the full Learnitive editor and runtime.'}</p>{lesson.exercise?.kind==='runtime'&&lesson.exercise.hint?<small>{lesson.exercise.hint}</small>:null}</div></div><div className=\"texise-learn-interac"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 251,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <article className=\"texise-page-container texise-learn-article texise-learn-lesson-player\"><a className=\"texise-text-link\" href={`/learn/${encodeURIComponent(courseSlug)}`}>← {lesson.course.title}</a><div className=\"texise-card-meta\"><span>{modeLabel(lesson.projectModeId)}</span><span>{lesson.lessonType}</span><span>{minutesLabel(lesson.estimatedMinutes)}</span>{lesson.accessTier==='pro'?<span className=\"texise-learn-pro\"><Crown className=\"size-3\"/> Pro</span>:null}</div><h1>{lesson.title"
    },
    {
      "path": "packages/core/app/src/saas/learn-pages.tsx",
      "line": 256,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if(LEGACY_GUIDE_SLUGS.has(decoded)){if(typeof window!=='undefined')window.location.replace(`/learn/latex-fundamentals/${encodeURIComponent(decoded)}`);return <section className=\"texise-page-container texise-page-heading\"><p>Opening migrated lesson…</p></section>}"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_PRICING_PLANS: readonly PublicPricingPlan[] = ["
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 101,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_PLAN_COMPARISON = ["
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 170,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const pricingPlans = TEXISE_PRICING_PLANS.map((plan) => plan.id === 'free'"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 179,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className={`texise-page-container texise-pricing-section texise-pricing-section-${variant}`} aria-labelledby={`texise-pricing-${variant}-title`}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 180,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-pricing-heading\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 181,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Pricing</span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 182,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h2 id={`texise-pricing-${variant}-title`}>{variant === 'home' ? 'A mindful pricing.' : 'Choose the plan that fits your workflow'}</h2>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 187,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-pricing-cards\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 191,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<article className={`texise-pricing-card${plan.id === 'lifetime' ? ' texise-pricing-card-featured' : ''}`} key={plan.id} data-plan={plan.id}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 192,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-pricing-card-head\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 195,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{plan.badge ? <span className=\"texise-pricing-badge\">{plan.badge}</span> : null}"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 204,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<a className={`texise-button ${plan.id === 'lifetime' ? 'texise-button-primary' : 'texise-button-secondary'}`} href={href} rel={plan.href === 'projects' ? undefined : 'noreferrer'}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 208,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-button texise-button-secondary is-disabled\" aria-disabled=\"true\" title={plan.id === 'monthly' ? 'Monthly Pro checkout is not configured on this deployment.' : 'Lifetime checkout is not configured on this deployment.'}>{plan.cta}</span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 214,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<p className=\"texise-muted texise-pricing-auth-note\">Sign-in is required for the Linux development environment and all collaboration participants. Starting a collaboration requires Pro; joining requires authenticated project access.</p>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 215,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<p className=\"texise-pricing-license-link\">Already purchased Learnitive Pro? <a className=\"texise-text-link\" href=\"/apply\">Apply your license <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a></p>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 216,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{variant === 'home' ? <a className=\"texise-text-link texise-pricing-compare-link\" href=\"/pricing\">Compare plans <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a> : null}"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 228,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const comparison = TEXISE_PLAN_COMPARISON.map(([feature, free, lifetime, monthly]) => [feature, freeProjectCopy(free, effectiveFreeProjectLimit), lifetime, monthly] as const);"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 230,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-public-section\" aria-labelledby=\"texise-plan-comparison-title\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 231,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 232,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Compare plans</span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 233,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h2 id=\"texise-plan-comparison-title\">Free and Pro, side by side</h2>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 235,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-table-scroll\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 236,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<table className=\"texise-pricing-matrix\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 241,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<p className=\"texise-muted texise-pricing-auth-note\">* Sign-in is required for the Linux development environment and all collaboration participants. Starting a collaboration requires Pro; joining requires authenticated project access.</p>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 249,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-public-section texise-faq-section\" aria-labelledby={`faq-${title.replace(/\\W+/gu, '-').toLowerCase()}`}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 250,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-faq-heading\"><span className=\"texise-eyebrow\">{eyebrow}</span><h2 id={`faq-${title.replace(/\\W+/gu, '-').toLowerCase()}`}>{title}</h2></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 251,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-faq-list\">{items.map(([question, answer]) => <details key={question}><summary><span>{question}</span><ChevronDown className=\"size-4\" aria-hidden=\"true\" /></summary><p>{freeProjectCopy(answer, effectiveFreeProjectLimit)}</p></details>)}</div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 271,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-page-container texise-final-cta\"><h2>{heading}</h2><p>{copy}</p><div className=\"texise-hero-actions\"><a className=\"texise-button texise-button-primary\" href={primaryHref}>{primaryLabel}<ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a><a className=\"texise-button texise-button-secondary\" href={secondaryHref}>{secondaryLabel}</a></div></section>;"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 287,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-why-section texise-power-features-section\" aria-labelledby=\"texise-power-features-title\" data-home-section=\"power-features\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 288,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-why-heading\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 289,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Built for LaTeX</span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 290,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h2 id=\"texise-power-features-title\">Power Features</h2>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 293,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-why-grid texise-power-features-grid\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 297,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<article className=\"texise-why-card texise-power-feature-card\" key={feature.title} style={{ '--texise-why-delay': `${index * 45}ms` } as React.CSSProperties}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 298,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-why-card-pin\" aria-hidden=\"true\"><Icon className=\"size-5\" /></span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 305,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-action\"><a className=\"texise-button texise-button-secondary\" href=\"/features\">Explore all features <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 337,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <span className=\"texise-compare-check\"><span className=\"sr-only\">Available</span><span aria-hidden=\"true\">✓</span></span>;"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 342,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-product-comparison\" data-home-section=\"comparison\" aria-labelledby=\"texise-overleaf-title\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 343,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-page-container\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 344,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Learnitive vs Overleaf</span><h2 id=\"texise-overleaf-title\">Switching from Overleaf?</h2><p>Both help you write LaTeX. Learnitive takes a different approach with local projects, browser-side tools and research workflows around files you control.</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 345,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-table-scroll texise-product-comparison-table\"><table className=\"texise-compare-table\"><thead><tr><th scope=\"col\">Feature</th><th scope=\"col\" className=\"texise-compare-texise\">Learnitive</th><th scope=\"col\">Overleaf</th></tr></thead><tbody>{PRODUCT_COMPARISON.map(([feature, texise, overleaf]) => <tr key={feature}><th scope=\"row\">{feature}</th><td className=\"texise-compare-texise\"><ComparisonValue value={texise} highlighted /></td><td><ComparisonValue value={overleaf}"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 346,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-comparison-cta\"><a className=\"texise-button texise-button-primary\" href=\"/projects\">Import your Overleaf project <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a><p>Export your Overleaf project as a ZIP, then choose <strong>Import ZIP</strong> in Learnitive.</p><div className=\"texise-comparison-links\"><a className=\"texise-text-link\" href=\"/compare/overleaf\">Compare Learnitive and Overleaf <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a><a class"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 367,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-page-container texise-feature-page-hero\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 368,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Features</span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 371,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-actions\"><a className=\"texise-button texise-button-primary texise-button-lg\" href=\"/projects\">Start writing <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a><a className=\"texise-button texise-button-secondary texise-button-lg\" href=\"/templates\">Browse templates</a></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 373,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-features-card-section\" aria-labelledby=\"texise-features-grid-title\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 374,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading texise-features-grid-heading\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 375,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Inside Learnitive</span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 376,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h2 id=\"texise-features-grid-title\">Tools for the whole LaTeX workflow</h2>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 379,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-features-card-grid\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 383,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<article className=\"texise-feature-card-v2\" key={feature.title}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 384,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-feature-card-icon\" aria-hidden=\"true\"><Icon className=\"size-6\" /></span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 493,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <span className={`texise-compare-status is-${tone}${highlighted ? ' is-highlighted' : ''}`}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 494,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{tone === 'positive' ? (highlighted ? <span className=\"texise-compare-tick\" aria-hidden=\"true\"><Check className=\"size-3.5\" /></span> : <CircleCheckBig className=\"size-4\" aria-hidden=\"true\" />) : null}"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 506,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <div className=\"texise-compare-directory-grid\">{competitors.map((item) => <a className=\"texise-compare-directory-card\" key={item.slug} href={`/compare/${item.slug}`}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 507,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">{item.eyebrow}</span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 510,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-text-link\">Read comparison <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 516,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-page-container texise-compare-hero\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 517,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Compare LaTeX editors</span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 520,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-actions\"><a className=\"texise-button texise-button-primary texise-button-lg\" href=\"/projects\">Open Workspace <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a><a className=\"texise-button texise-button-secondary texise-button-lg\" href=\"/features\">View features</a></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 522,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-strengths\" aria-labelledby=\"compare-strengths-title\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 523,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Why Learnitive</span><h2 id=\"compare-strengths-title\">Your local first workspace for research</h2><p>Keep ordinary LaTeX files, local compilation, PDF, AI, Paper Memory, Git, terminal and collaboration around the same project.</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 524,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-compare-strength-grid\">{COMPARE_HUB_STRENGTHS.map((item) => { const Icon = item.icon; return <article key={item.title}><span aria-hidden=\"true\"><Icon className=\"size-5\" /></span><h3>{item.title}</h3><p>{item.copy}</p></article>; })}</div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 526,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-directory\" aria-labelledby=\"compare-directory-title\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 527,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Direct comparisons</span><h2 id=\"compare-directory-title\">Direct comparisons</h2><p>Competitor facts are dated and sourced. Unknown capabilities stay marked as not verified.</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 530,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-directory\" aria-labelledby=\"compare-guides-title\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 531,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Decision guides</span><h2 id=\"compare-guides-title\">Compare by workflow</h2><p>Choose a guide when you are comparing a type of editor rather than one product.</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 532,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-compare-directory-grid\">{COMPARE_GUIDES.map((guide) => <a className=\"texise-compare-directory-card\" key={guide.slug} href={`/compare/${guide.slug}`}><span className=\"texise-eyebrow\">{guide.eyebrow}</span><h3>{guide.title}</h3><p>{guide.summary}</p><span className=\"texise-text-link\">Open guide <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></span></a>)}</div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 534,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-capabilities\" aria-labelledby=\"compare-capabilities-title\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 535,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Inside Learnitive</span><h2 id=\"compare-capabilities-title\">One project, connected tools</h2></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 536,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-compare-capability-list\">{['Local projects and linked folders','Local Compile + exact Live PDF','Instant PDF for safely eligible edits','Browser Local AI','Ollama local-service AI','BYOK AI','Paper Memory and AI Review','Scientific code and terminal tools','Source and Visual editing','Git and version history'].map((item) => <span key={item}><CircleCheckBig className=\"size-4\" aria-hidden=\"true\" />{item}</span>)}</div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 548,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-page-container texise-compare-detail-hero\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 549,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<a className=\"texise-text-link texise-compare-back\" href=\"/compare\">← Compare editors</a>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 550,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">{guide.eyebrow}</span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 554,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-detail-section\" aria-labelledby={`guide-${guide.slug}-verdicts`}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 555,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Quick verdicts</span><h2 id={`guide-${guide.slug}-verdicts`}>Best fit by workflow</h2><p>{guide.methodology}</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 556,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-compare-strength-grid\">{guide.verdicts.map(([priority, product, reason]) => <article key={`${priority}-${product}`}><p className=\"texise-compare-fit-label\">{priority}</p><h3>{product}</h3><p>{reason}</p></article>)}</div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 558,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-directory\" aria-labelledby={`guide-${guide.slug}-title`}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 559,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Detailed comparisons</span><h2 id={`guide-${guide.slug}-title`}>Editors in this guide</h2><p>Open a direct comparison for dated competitor facts, pricing and migration notes.</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 571,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const lifetime = TEXISE_PRICING_PLANS.find((plan) => plan.id === 'lifetime');"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 572,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const monthly = TEXISE_PRICING_PLANS.find((plan) => plan.id === 'monthly');"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 574,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-page-container texise-compare-detail-hero\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 575,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<a className=\"texise-text-link texise-compare-back\" href=\"/compare\">← Compare editors</a>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 576,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">{item.eyebrow}</span>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 579,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-hero-actions\"><a className=\"texise-button texise-button-primary texise-button-lg\" href=\"/projects\">Open Learnitive <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a><a className=\"texise-button texise-button-secondary texise-button-lg\" href={item.website} target=\"_blank\" rel=\"noopener noreferrer\">Visit {item.name}</a></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 581,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-detail-section\" aria-labelledby={`why-texise-${item.slug}`}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 582,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Why Learnitive</span><h2 id={`why-texise-${item.slug}`}>Why Learnitive differs</h2></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 583,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-compare-strength-grid\">{item.strengths.map((entry) => { const Icon = entry.icon; return <article key={entry.title}><span aria-hidden=\"true\"><Icon className=\"size-5\" /></span><h3>{entry.title}</h3><p>{entry.copy}</p></article>; })}</div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 585,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-detail-section\" aria-labelledby={`feature-compare-${item.slug}`}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 586,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Features</span><h2 id={`feature-compare-${item.slug}`}>Learnitive vs {item.name}</h2><p>Plan-dependent and unverified capabilities are labelled explicitly.</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 587,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-table-scroll texise-compare-detail-table\"><table className=\"texise-compare-table\"><thead><tr><th scope=\"col\">Capability</th><th scope=\"col\" className=\"texise-compare-texise\">Learnitive</th><th scope=\"col\">{item.name}</th></tr></thead><tbody>{item.rows.map(([feature, texise, competitor]) => <tr key={feature}><th scope=\"row\">{feature}</th><td className=\"texise-compare-texise\"><DetailedComparisonValue value={texise} highlighted /></td><td><DetailedComparisonValue value"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 589,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-two-column\">"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 590,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<article><span className=\"texise-eyebrow\">Learnitive differences</span><h2>Local project control</h2><ul>{item.differences.map((point) => <li key={point}><CircleCheckBig className=\"size-4\" aria-hidden=\"true\" /><span>{point}</span></li>)}</ul></article>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 591,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<article><span className=\"texise-eyebrow\">Good fit for</span><h2>Connected research work</h2><ul>{item.fit.map((point) => <li key={point}><CircleCheckBig className=\"size-4\" aria-hidden=\"true\" /><span>{point}</span></li>)}</ul></article>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 593,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-detail-section\" aria-labelledby={`migration-${item.slug}`}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 594,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Migration</span><h2 id={`migration-${item.slug}`}>Move from {item.name}</h2><p>Move the project files, then verify the compiled result.</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 595,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<ol className=\"texise-compare-migration\">{item.migration.map((step, index) => <li key={step}><span aria-hidden=\"true\">{index + 1}</span><p>{step}</p></li>)}</ol>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 597,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-pricing\" aria-labelledby={`pricing-compare-${item.slug}`}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 598,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Pricing</span><h2 id={`pricing-compare-${item.slug}`}>Pricing</h2></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 599,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-compare-pricing-grid\"><article className=\"is-texise\"><h3>Learnitive</h3><p><strong>Free:</strong> $0 forever · up to {effectiveFreeProjectLimit} projects</p><p><strong>Pro Lifetime:</strong> {lifetime?.price ?? '$29/ one-time'}</p><p><strong>Pro Monthly:</strong> {monthly?.price ?? '$5 / month'}</p><a className=\"texise-text-link\" href=\"/pricing\">View Learnitive pricing <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a></article><article><h3>{item.name}<"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 600,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<p className=\"texise-compare-reviewed\">Competitor information last verified {compareVerifiedLabel(item.lastVerified)}. Features and prices can change; use the source links below before making a purchase decision.</p>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 603,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-compare-detail-section\" aria-labelledby={`sources-${item.slug}`}>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 604,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-section-heading texise-centered-heading\"><span className=\"texise-eyebrow\">Sources</span><h2 id={`sources-${item.slug}`}>Competitor sources</h2><p>Checked against provider-controlled sources on {compareVerifiedLabel(item.lastVerified)}.</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 605,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<ul className=\"texise-compare-sources\">{item.sources.map((source) => <li key={source.url}><a className=\"texise-text-link\" href={source.url} target=\"_blank\" rel=\"noopener noreferrer\">{source.label} <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a></li>)}</ul>"
    },
    {
      "path": "packages/core/app/src/saas/public-marketing.tsx",
      "line": 617,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-page-container texise-home-differentiators\" aria-label=\"Why Learnitive\">{items.map((item) => { const Icon = item.icon; return <article key={item.title}><Icon className=\"size-5\" aria-hidden=\"true\" /><div><h2>{item.title}</h2><p>{item.copy}</p></div></article>; })}</section>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 125,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "headers: auth.authenticated ? { 'x-texise-csrf': auth.csrfToken } : {},"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 135,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "headers: { 'x-texise-csrf': auth.csrfToken },"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 208,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'x-texise-csrf': csrfToken,"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 285,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "headers: { 'Content-Type': 'application/octet-stream', ...(auth.authenticated ? { 'x-texise-csrf': auth.csrfToken } : {}) },"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 547,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "headers: { Accept: 'application/json', 'x-texise-csrf': auth.csrfToken },"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 562,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "headers: { Accept: 'application/json', 'x-texise-csrf': auth.csrfToken },"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 574,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const response=await fetch('/api/admin/learn/upload-cover',{method:'POST',credentials:'same-origin',cache:'no-store',headers:{Accept:'application/json','x-texise-csrf':auth.csrfToken},body});"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 581,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const response=await fetch(`/api/admin/learn/lessons/${lessonId}/media/${kind}`,{method:'POST',credentials:'same-origin',cache:'no-store',headers:{Accept:'application/json','x-texise-csrf':auth.csrfToken},body});"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 631,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "provenance?: 'official' | 'adapted' | 'community' | 'texise';"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 697,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "headers: { Accept: 'application/json', 'x-texise-csrf': auth.csrfToken },"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 733,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "headers: { Accept: 'application/json', 'x-texise-csrf': auth.csrfToken },"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 752,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "headers: { Accept: 'application/json', 'x-texise-csrf': auth.csrfToken },"
    },
    {
      "path": "packages/core/app/src/saas/saas-api.ts",
      "line": 769,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "headers: { Accept: 'application/json', 'x-texise-csrf': auth.csrfToken }, body,"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 228,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <React.Suspense fallback={<div className=\"texise-template-pdfjs-state\">Loading PDF preview…</div>}><LazyTemplatePdfPreview {...props}/></React.Suspense>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 264,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise:preferred-project-storage',"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 379,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "document.head.querySelectorAll('meta[property=\"article:tag\"][data-texise-dynamic=\"true\"]').forEach((node) => { node.remove(); });"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 384,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "node.dataset.texiseDynamic = 'true';"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 522,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const texiseConfig = mode.id === 'latex' ? createDefaultTexiseProjectConfig() : undefined;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 523,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "if (texiseConfig) texiseConfig.rootFile = payload.entryFile;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 536,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "...(texiseConfig ? { project: texiseConfig } : {}),"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 564,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-page-container texise-page-heading texise-try-example\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 565,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Learn → Editor</span>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 566,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h1 className=\"texise-display\">{state === 'creating' ? 'Opening your learning workspace…' : 'Could not open this example'}</h1>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 568,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{state === 'error' ? <a className=\"texise-text-link\" href=\"/learn\">Return to Learn →</a> : <LoaderCircle className=\"size-6 animate-spin\" aria-label=\"Creating example project\" />}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 627,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-empty-state\" data-testid=\"texise-collaboration-link-join\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 629,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h1 className=\"texise-display\">Unable to join project</h1>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 631,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"flex flex-wrap justify-center gap-2\"><Button onClick={() => setRunId((value) => value + 1)}>Retry</Button><a className=\"texise-button texise-button-secondary\" href=\"/projects\">Cancel</a></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 633,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<LoaderCircle className=\"texise-project-join-spinner size-8\" />"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 634,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h1 className=\"texise-display\">Joining project…</h1>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 636,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{percent !== undefined ? <div className=\"texise-project-join-progress\" role=\"progressbar\" aria-label=\"Shared project loading progress\" aria-valuemin={0} aria-valuemax={100} aria-valuenow={percent}><span style={{ width: `${percent}%` }} /></div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 644,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-site-shell\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 655,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-site-shell texise-app-page\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 657,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<main className=\"texise-page-container texise-app-main\">{children}</main>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 666,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<a className=\"texise-brand\" href=\"/\" aria-label=\"Learnitive home\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 667,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<img className=\"texise-brand-logo\" src=\"/learnitive-logo-mobile.png\" alt=\"\" />"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 668,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-brand-name\">Learnitive</span>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 679,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <button type=\"button\" className=\"texise-icon-button\" aria-label={label} title={label} onClick={() => workbenchState.changeThemePreference(next)}><Icon className=\"size-4\" /></button>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 684,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (loading) return <span className=\"texise-avatar texise-avatar-loading\" aria-hidden />;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 691,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-site-header\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 692,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-page-container texise-header-inner\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 694,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<nav className=\"texise-public-nav\" aria-label=\"Primary\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 697,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-header-actions\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 699,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<a className=\"texise-button texise-button-primary texise-header-start\" href=\"/projects\">Open</a>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 700,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<button type=\"button\" className=\"texise-icon-button texise-mobile-menu-button\" aria-label=\"Menu\" onClick={() => setMobile((value) => !value)}>{mobile ? <X className=\"size-4\" /> : <Menu className=\"size-4\" />}</button>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 703,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{mobile ? <nav className=\"texise-mobile-nav\" aria-label=\"Mobile\"><a href=\"/features\">Features</a><a href=\"/templates\">Templates</a><a href=\"/learn\">Learn</a><a href=\"/blog\">Blog</a><a href=\"/pricing\">Pricing</a><a href=\"/about\">About</a><a href=\"/projects\">Open Workspace</a></nav> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 709,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <header className=\"texise-app-header\"><div className=\"texise-page-container texise-header-inner\"><Brand /><nav className=\"texise-app-nav\"><a href=\"/projects\">Projects</a><a href=\"/explore\">Explore</a><a href=\"/templates\">Templates</a><a href=\"/learn\">Learn</a><a href=\"/docs\">Docs</a></nav><div className=\"texise-header-actions\"><SearchButton /><ThemeControl /><AccountControl /></div></div></header>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 713,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <button type=\"button\" className=\"texise-icon-button texise-search-trigger\" aria-label=\"Search\" title=\"Search (/)\" onClick={() => window.dispatchEvent(new CustomEvent('texise:public-search'))}><Search className=\"size-4\" /></button>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 732,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "window.addEventListener('texise:public-search', custom);"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 733,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return () => { window.removeEventListener('keydown', key); window.removeEventListener('texise:public-search', custom); };"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 785,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <Dialog open={open} onOpenChange={setOpen}><DialogContent className=\"sm:max-w-xl\"><DialogHeader><DialogTitle>Search Learnitive</DialogTitle><DialogDescription>Search templates, courses, documentation, published articles and public Learnitive pages.</DialogDescription></DialogHeader><Input autoFocus value={query} onChange={(event) => setQuery(event.currentTarget.value)} placeholder=\"Search…\" /><div className=\"texise-search-results\">{filtered.map((item) => <a key={`${item.type"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 803,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <footer className=\"texise-site-footer\"><div className=\"texise-page-container texise-footer-grid\"><div className=\"texise-footer-brand\"><Brand /><p>Local first scientific writing with browser-local LaTeX compilation.</p><div className=\"texise-footer-socials\" role=\"group\" aria-label=\"Learnitive social media\"><a className=\"texise-footer-social-link\" href=\"https://www.facebook.com/Learnitive AI/\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Follow Learnitive on Fa"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 807,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <div className=\"texise-hero-actions\"><a className=\"texise-button texise-button-primary texise-button-lg\" href=\"/projects\">Open Workspace <ArrowRight className=\"size-4\" /></a><a className=\"texise-button texise-button-secondary texise-button-lg\" href=\"/templates\">Browse Templates</a></div>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 852,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <><MarketingPageHeading eyebrow=\"Use Cases\" title=\"Learnitive for research workflows\" copy=\"Focused workflows for writing papers, theses, collaborative reviews and reproducible LaTeX projects.\" /><section className=\"texise-page-container texise-use-case-index\">{RESEARCH_USE_CASES.map((item) => <a className=\"texise-use-case-index-card\" key={item.slug} href={`/use-cases/${item.slug}`}><span className=\"texise-eyebrow\">{item.eyebrow}</span><h2>{item.title}</h2><p>{item.summary}</p><spa"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 858,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <article className=\"texise-page-container texise-use-case-detail texise-use-case-detail-v2\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 859,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-use-case-hero\"><a className=\"texise-text-link\" href=\"/use-cases\">← Use Cases</a><span className=\"texise-eyebrow\">{item.eyebrow}</span><h1>{item.title}</h1><p>{item.summary}</p></header>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 860,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-use-case-context\"><div><span className=\"texise-eyebrow\">The goal</span><h2>What you are trying to produce</h2><p>{item.goal}</p></div><div><span className=\"texise-eyebrow\">The friction</span><h2>What makes it difficult</h2><p>{item.challenge}</p></div></section>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 861,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-use-case-help\"><div><span className=\"texise-eyebrow\">How Learnitive helps</span><h2>A project-centred workflow</h2><p>{item.intro}</p></div><div className=\"texise-use-case-capabilities\">{item.capabilities.map(([title, copy]) => <div key={title}><Check className=\"size-4\" aria-hidden=\"true\" /><div><h3>{title}</h3><p>{copy}</p></div></div>)}</div></section>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 862,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-use-case-next\"><div className=\"texise-section-heading\"><span className=\"texise-eyebrow\">Workflow</span><h2>What to do next</h2></div><ol>{item.workflow.map((step, index) => <li key={step}><span>{String(index + 1).padStart(2, '0')}</span><strong>{step}</strong></li>)}</ol></section>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 868,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <header className=\"texise-page-container texise-page-heading\"><span className=\"texise-eyebrow\">{eyebrow}</span><h1 className=\"texise-display\">{title}</h1><p>{copy}</p></header>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 895,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function LoadingCard() { return <div className=\"texise-loading-card\" aria-live=\"polite\">Loading…</div>; }"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 904,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <span className=\"texise-template-institution-mark\">{institution.logoUrl ? <img src={institution.logoUrl} alt=\"\" loading=\"lazy\" /> : institution.shortName || institution.displayName.slice(0, 3)}</span>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1042,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-page-container texise-page-heading texise-template-directory-hero\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1043,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Learnitive Template Library</span>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1044,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h1 className=\"texise-display\">Start with a project that already fits your stack.</h1>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1046,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-hero-search\"><Search className=\"size-5\" aria-hidden=\"true\"/><Input value={query} onChange={(event) => setQuery(event.currentTarget.value)} placeholder=\"Search React dashboards, Python data tools, LaTeX CVs…\" aria-label=\"Search project templates\"/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1049,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-template-directory-section texise-template-fresh-section\" data-testid=\"fresh-starting-points\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1050,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-directory-heading\"><div><span className=\"texise-eyebrow\">Start here</span><h2>Fresh starting points</h2><p>Small starter projects across languages and frameworks. Choose one and start editing immediately.</p></div></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1052,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-card-grid texise-template-grid texise-template-featured-grid\">{loading ? <LoadingCard/> : displayedFreshStartingPoints.map((template) => <TemplateCard key={template.id} template={template} institutions={institutions} onQuickPreview={setQuickPreview}/>)}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1055,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-template-directory-section texise-template-all-section\" id=\"all-templates\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1056,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-directory-heading\"><div><span className=\"texise-eyebrow\">Full catalog</span><h2>All templates</h2><p>Use filters when you know the academic, technical or access requirements you need.</p></div><div className=\"texise-template-sort\"><Label htmlFor=\"template-sort\">Sort</Label><select id=\"template-sort\" value={sort} onChange={(event)=>setSort(event.currentTarget.value as typeof sort)}><option value=\"verified\">Recently verified</option><option value=\"updated\">Recently "
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1057,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-browser\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1058,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<aside className=\"texise-template-filter-panel\" aria-label=\"Template filters\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1059,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-filter-panel-head\"><strong>Filters{activeFilterCount ? ` (${activeFilterCount})` : ''}</strong>{activeFilterCount ? <button type=\"button\" onClick={clearFilters}>Clear</button> : null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1064,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><Label>Access</Label><div className=\"texise-segmented texise-template-tier-segment\">{(['all','free','pro'] as const).map((value) => <button type=\"button\" key={value} data-active={tier===value} onClick={() => setTier(value)}>{value === 'all' ? 'All' : value === 'free' ? 'Free' : 'Pro'}</button>)}</div></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1065,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<details><summary>More Filters</summary><div className=\"texise-template-more-filters\"><div><Label htmlFor=\"template-filter-category\">Legacy LaTeX category</Label><select id=\"template-filter-category\" value={category} onChange={(event)=>setCategory(event.currentTarget.value)}><option value=\"all\">All document types</option>{browseCategories.map((item)=><option key={item.id} value={item.id}>{item.name}</option>)}</select></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1071,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-results\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1072,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-filter-summary\" aria-live=\"polite\"><span>{loading ? 'Loading templates…' : sorted.length ? `${pageStart + 1}–${Math.min(pageStart + TEMPLATE_PAGE_SIZE, sorted.length)} of ${sorted.length} matching · ${templates.length} total` : `0 of ${templates.length} templates`}</span>{activeFilterCount ? <span>Filtered catalog</span> : <span>Complete catalog</span>}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1073,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-card-grid texise-template-grid\">{loading ? <LoadingCard/> : pageRows.map((template)=><TemplateCard key={template.id} template={template} institutions={institutions} onQuickPreview={setQuickPreview}/>)}{!loading && sorted.length === 0 ? <div className=\"texise-empty-state\"><h2>No templates match</h2><p>Clear one or more filters or search using a broader term.</p><Button variant=\"outline\" onClick={clearFilters}>Clear filters</Button></div> : null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1074,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{!loading && sorted.length > TEMPLATE_PAGE_SIZE ? <nav className=\"texise-template-pagination\" aria-label=\"Template catalog pagination\"><button type=\"button\" disabled={currentPage<=1} onClick={()=>goToTemplatePage(currentPage-1)}>← Previous</button><div>{Array.from({length:totalPages},(_,index)=>index+1).filter((value)=>value===1||value===totalPages||Math.abs(value-currentPage)<=1).map((value,index,array)=><React.Fragment key={value}>{index>0&&value-(array[index-1]??value)>1?<span aria-hidden=\"tr"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1079,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-template-missing-cta\"><div><span className=\"texise-eyebrow\">Bring your own project</span><h2>Can't find the template you need?</h2><p>Import a university or publisher ZIP into Learnitive, or start a clean local first project and keep writing.</p></div><div className=\"texise-template-missing-actions\"><a className=\"texise-button texise-button-primary\" href=\"/projects\">Import ZIP</a><a className=\"texise-button texise-button-secondary\" href=\"/p"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1085,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const DEFAULT_TEMPLATE_THUMBNAIL_URL = '/texise-template-default-thumbnail.webp';"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1110,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className=\"texise-template-card texise-template-card-clickable\""
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1122,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-card-preview-link\" aria-hidden=\"true\"><TemplatePreviewSurface template={template} compact/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-card-body\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1124,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-card-meta\"><span>{template.primaryLanguage}</span>{template.framework ? <span>{template.framework}</span> : null}<span>{template.useCaseId.replaceAll('-', ' ')}</span></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1126,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{institutionName ? <p className=\"texise-template-institution\"><strong>{institutionName}</strong>{template.degreeLevels.length ? ` · ${template.degreeLevels.join(', ')}` : ''}</p> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1128,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-mini-meta\"><span>{template.projectType}</span>{template.validationStatus === 'valid' ? <span>Validated</span> : null}{template.compiler ? <span>{template.compiler}</span> : null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1135,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <Dialog open={Boolean(template)} onOpenChange={(open)=>{if(!open)onClose()}}><DialogContent className=\"texise-template-quick-dialog\">{template ? <>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1137,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-quick-layout\"><div className=\"texise-template-quick-preview\"><TemplatePreviewSurface template={template}/></div><div className=\"texise-template-quick-copy\"><div className=\"texise-card-meta\"><span>{template.primaryLanguage}</span>{template.framework?<span>{template.framework}</span>:null}<span>{template.useCaseId.replaceAll('-', ' ')}</span></div><p>{template.description}</p><dl className=\"texise-template-quick-facts\">{institution?<div><dt>Institution</dt><dd>{inst"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1154,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-institution-directory\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1155,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-institution-directory-controls\"><div className=\"texise-template-hero-search\"><Search className=\"size-5\" aria-hidden=\"true\"/><Input value={query} onChange={(event)=>setQuery(event.currentTarget.value)} placeholder=\"Search universities or regions…\"/></div><select aria-label=\"Institution country\" value={country} onChange={(event)=>setCountry(event.currentTarget.value)}><option value=\"all\">All countries</option>{countries.map((value)=><option key={value} value={value}>{value}<"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1157,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-filter-summary\" aria-live=\"polite\"><span>{loading?'Loading institutions…':`${rows.length} institutions with templates`}</span><a className=\"texise-text-link\" href=\"/templates\">Back to all templates <ChevronRight className=\"size-4\"/></a></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1158,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{loading?<LoadingCard/>:[...grouped.entries()].map(([countryName,countryRows])=><section className=\"texise-institution-country-group\" key={countryName}><div className=\"texise-template-directory-heading\"><div><span className=\"texise-eyebrow\">Country</span><h2>{countryName}</h2></div></div><div className=\"texise-template-institution-strip\">{countryRows.map(({institution,count})=><a className=\"texise-template-institution-card\" key={institution.id} href={`/templates/institutions/${institution.slug}`"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1159,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{!loading&&rows.length===0?<div className=\"texise-empty-state\"><h2>No institutions match</h2><p>Try a broader university name or country.</p></div>:null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1174,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container\"><div className=\"texise-template-filter-summary\"><a className=\"texise-text-link\" href=\"/templates\">All templates <ChevronRight className=\"size-4\"/></a><a className=\"texise-text-link\" href=\"/templates/institutions\">Browse universities <ChevronRight className=\"size-4\"/></a></div><div className=\"texise-card-grid texise-template-grid\">{rows.map((template)=><TemplateCard key={template.id} template={template} institutions={institutions} onQuickPreview={setQuic"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1196,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-institution-template-page\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1197,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{institution.logoUrl ? <div className=\"texise-institution-detail-logo\"><img src={institution.logoUrl} alt={`${institution.displayName} logo`} /></div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1198,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-institution-detail-meta\"><span>{allRows.length} {allRows.length===1?'template':'templates'}</span>{institution.region?<span>{institution.region}</span>:null}{lastVerified?<span>Latest verification {lastVerified}</span>:null}{institution.website?<a className=\"texise-text-link\" href={institution.website} target=\"_blank\" rel=\"noopener noreferrer\">Institution website <ExternalLink className=\"size-3\"/></a>:null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1199,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{degrees.length?<nav className=\"texise-template-intent-chips\" aria-label=\"Degree level\"><button type=\"button\" data-active={degree==='all'} onClick={()=>setDegree('all')}>All</button>{degrees.map((value)=><button type=\"button\" data-active={degree===value} key={value} onClick={()=>setDegree(value)}>{value}</button>)}</nav>:null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1200,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-card-grid texise-template-grid\">{rows.map((template)=><TemplateCard key={template.id} template={template} institutions={institutions} onQuickPreview={setQuickPreview}/>)}{rows.length===0?<div className=\"texise-empty-state\"><p>No published templates match this degree filter.</p></div>:null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1201,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<aside className=\"texise-template-provenance-note\"><strong>Institution classification</strong><p>Templates in this directory can be official, adapted, community-created, or Learnitive-created. Check each template detail page before treating it as an institution-approved submission format.</p></aside>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1220,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-page-container texise-template-detail\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1221,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-preview\"><TemplatePreviewSurface template={template} /></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1222,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-detail-copy\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1223,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<div className=\"texise-card-meta\"><span>{template.category || 'Uncategorised'}</span><span className=\"texise-badge\">Template</span><span>{provenance}</span></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1224,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h1 className=\"texise-display\">{template.name}</h1>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1225,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{institution ? <p className=\"texise-template-institution\"><a className=\"texise-text-link\" href={`/templates/institutions/${institution.slug}`}>{institution.displayName}</a>{template.degreeLevels.length ? ` · ${template.degreeLevels.join(', ')}` : ''}</p> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1227,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<dl className=\"texise-template-facts\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1238,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{template.features.length ? <section className=\"texise-template-features\"><h2>Template features</h2><ul>{template.features.map((feature) => <li key={feature}><Check className=\"size-4\" /> {feature}</li>)}</ul></section> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1239,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{template.requiredPackages.length ? <section className=\"texise-template-packages\"><h2>Required packages</h2><div className=\"texise-tag-row\">{template.requiredPackages.map((pkg) => <span key={pkg}>{pkg}</span>)}</div></section> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1240,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{template.tags.length ? <div className=\"texise-tag-row\">{template.tags.map((tag) => <span key={tag}>{tag}</span>)}</div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1241,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{template.sourceUrl ? <p><a className=\"texise-text-link\" href={template.sourceUrl} target=\"_blank\" rel=\"noopener noreferrer\">Template source <ExternalLink className=\"size-3\" /></a></p> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1242,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "{template.attribution ? <p className=\"texise-muted\">{template.attribution}</p> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1264,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const parent = await pickDirectory({ id: 'texise-template-location' });"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1272,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const texiseConfig = mode.id === 'latex' ? (template.config ?? createDefaultTexiseProjectConfig()) : undefined;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1273,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "if (texiseConfig) texiseConfig.rootFile = template.entryFile;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1279,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "...(texiseConfig ? { project: texiseConfig } : {}),"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1310,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "try { preference = localStorage.getItem('learnitive:preferred-project-storage') ?? localStorage.getItem('texise:preferred-project-storage'); } catch { /* ignore */ }"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1314,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <><Button className=\"texise-apply-button\" disabled={busy} onClick={start}>{busy ? 'Creating project…' : 'Apply Template'}</Button><Dialog open={chooser} onOpenChange={(value) => !busy && setChooser(value)}><DialogContent className=\"sm:max-w-md\"><DialogHeader><DialogTitle>Where should this project live?</DialogTitle><DialogDescription>Project contents stay local. Choose only where this project should be created.</DialogDescription></DialogHeader><div className=\"texise-storage-choice\"><butt"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1369,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "return <section className=\"texise-auth-page\"><div className=\"texise-auth-card\"><Brand /><span className=\"texise-eyebrow\">{register ? 'Create account' : 'Welcome back'}</span><h1 className=\"texise-display\">{register ? 'Keep safe Learnitive metadata in sync.' : returnTo === '/apply' ? 'Sign in to apply your license.' : 'Continue to your projects.'}</h1><p>{register ? 'Registration uses Google. Your manuscript files still remain local by default.' : returnTo === '/apply' ? 'Sign in with Goog"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1402,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (state.error) return <div className=\"texise-empty-state\"><FileCode2 className=\"size-7\"/><h1 className=\"texise-display\">Shared project unavailable</h1><p>{state.error}</p><a className=\"texise-button texise-button-secondary\" href=\"/projects\">Projects</a></div>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1405,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-page-container space-y-5\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1406,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><span className=\"texise-eyebrow\">Authenticated project share</span><h1 className=\"texise-display\">{project.name}</h1><p>Access granted as <strong>{state.permission === 'edit' ? 'editor' : 'viewer'}</strong>. This share authorization is checked server-side and stops working if the owner revokes the link.</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1407,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{href ? <a className=\"texise-button texise-button-primary\" href={href}>Open local project</a> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1425,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (!item.cover_image_url) return <div className={`texise-blog-cover texise-blog-cover-placeholder${featured ? ' texise-blog-cover-featured' : ''}`} aria-hidden><FileText className=\"size-9\" /></div>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1426,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <div className={`texise-blog-cover${featured ? ' texise-blog-cover-featured' : ''}`}><img src={item.cover_image_url} alt={item.cover_image_alt || ''} width={item.cover_image_width || undefined} height={item.cover_image_height || undefined} loading={featured ? 'eager' : 'lazy'} /></div>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1430,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <a className={`texise-blog-card${featured ? ' texise-blog-card-featured' : ''}`} href={`/blog/${item.slug}`} aria-label={`Read blog post: ${item.title}`}>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1432,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<article className=\"texise-blog-card-body\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1433,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-blog-card-meta\"><time>{blogDate(item.published_at)}</time>{item.tags?.length ? <span className=\"texise-blog-mini-tags\">{item.tags.slice(0, featured ? 3 : 2).map((tag) => <span key={tag}>{tag}</span>)}</span> : null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1434,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-blog-card-copy\"><h2>{item.title}</h2>{item.excerpt ? <p>{item.excerpt}</p> : null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1435,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{item.author ? <div className=\"texise-blog-author\">{item.author_avatar_url ? <img className=\"texise-blog-author-avatar\" src={item.author_avatar_url} alt=\"\" referrerPolicy=\"no-referrer\" /> : <span className=\"texise-blog-author-avatar\" aria-hidden>{item.author.trim().slice(0, 1).toUpperCase()}</span>}<span>{item.author}</span></div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1460,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-page-container texise-change-log-page\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1461,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-change-log-heading\"><span className=\"texise-eyebrow\">Product updates</span><h1 className=\"texise-display\">{page.title || 'Change log'}</h1>{page.intro_html ? <DocsSanitizedHtml html={page.intro_html} /> : <p>Recent improvements, fixes and new capabilities in Learnitive.</p>}</header>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1463,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{loading ? <LoadingCard /> : items.length ? <div className=\"texise-change-log-timeline\">{items.map((item) => <article className=\"texise-change-log-event\" key={item.id}>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1464,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-change-log-date\"><CalendarDays className=\"size-4\" aria-hidden=\"true\"/><time dateTime={item.change_date}>{changeLogDate(item.change_date)}</time></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1465,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-change-log-card\"><h2>{item.title}</h2>{item.content_html ? <DocsSanitizedHtml html={item.content_html} /> : null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1466,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "</article>)}</div> : <div className=\"texise-empty-state\"><p>No published changes yet.</p></div>}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1492,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-page-container texise-blog-page\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1493,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-blog-heading\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1495,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<label className=\"texise-blog-search\"><Search className=\"size-5\" /><span className=\"sr-only\">Search blog posts</span><input type=\"search\" value={query} onChange={(event) => { setQuery(event.currentTarget.value); setPage(1); }} placeholder=\"Search posts…\" /></label>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1497,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<nav className=\"texise-blog-tags\" aria-label=\"Blog tags\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1503,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-blog-featured\"><BlogPostCard item={featured} featured /></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1504,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{rest.length ? <div className=\"texise-blog-grid\">{rest.map((item) => <BlogPostCard key={item.slug} item={item} />)}</div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1505,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{totalPages > 1 ? <nav className=\"texise-blog-pagination\" aria-label=\"Blog pagination\"><button type=\"button\" disabled={page <= 1} onClick={() => setPage((value) => Math.max(1, value - 1))}>← Newer</button><span>Page {page} of {totalPages}</span><button type=\"button\" disabled={page >= totalPages} onClick={() => setPage((value) => Math.min(totalPages, value + 1))}>Older →</button></nav> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1538,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <nav className=\"texise-docs-nav\" aria-label=\"Documentation\">{groupDocs(items).map(([category,docs])=><section key={category}><h2>{category}</h2>{docs.map((doc)=><a key={doc.slug} href={`/docs/${doc.slug}`} data-active={doc.slug===activeSlug?'true':undefined} aria-current={doc.slug===activeSlug?'page':undefined}>{doc.title}</a>)}</section>)}</nav>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1546,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <div className=\"texise-docs-mobile-navigation\"><Button variant=\"outline\" type=\"button\" onClick={()=>setOpen(true)} aria-haspopup=\"dialog\"><Menu className=\"size-4\"/> Browse docs</Button><Dialog open={open} onOpenChange={setOpen}><DialogContent className=\"texise-docs-drawer\"><DialogHeader><DialogTitle>Learnitive Docs</DialogTitle><DialogDescription>Search documentation and browse pages by category.</DialogDescription></DialogHeader><label className=\"texise-docs-filter\"><span classNam"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1582,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.querySelector(':scope > .texise-docs-code-copy')) continue;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1585,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button.type='button'; button.className='texise-docs-code-copy'; button.textContent='Copy'; button.setAttribute('aria-label','Copy code');"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1592,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <div ref={ref} className=\"texise-prose texise-docs-prose\" dangerouslySetInnerHTML={{__html:html}}/>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1624,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <article className=\"texise-blog-article-shell\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1625,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className={`texise-blog-article-hero${item.cover_image_url ? '' : ' texise-blog-article-hero-placeholder'}`}>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1628,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-blog-article-header\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1629,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{dateLabel ? <div className=\"texise-blog-written\">Written on <time dateTime={published?.toISOString()}>{dateLabel}</time>{updatedLabel ? <> · Updated <time dateTime={updated?.toISOString()}>{updatedLabel}</time></> : null}</div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1631,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{item.tags?.length ? <nav className=\"texise-blog-article-tags\" aria-label=\"Article tags\">{item.tags.map((tag) => <a key={tag} href={blogTagHref(tag)} aria-label={`Show blog posts tagged ${tag}`}>{tag}</a>)}</nav> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1632,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-blog-article-author\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1636,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<nav className=\"texise-blog-share\" aria-label=\"Share this article\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1644,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-blog-article-content\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1645,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<SanitizedHtml html={item.content_html} className=\"texise-prose texise-blog-article-prose\" />"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1646,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<nav className=\"texise-prev-next\" aria-label=\"Article pagination\">{item.previous ? <a href={`/blog/${item.previous.slug}`}>← {item.previous.title}</a> : <span />}{item.next ? <a href={`/blog/${item.next.slug}`}>{item.next.title} →</a> : null}</nav>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1656,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const preparedDocs=React.useMemo(()=>kind==='docs'&&item?prepareDocsHtml(item.content_html.replaceAll('{{TEXISE_FREE_PLAN_LIMIT}}', String(config?.freePlanProjectLimit ?? 5))):{html:'',toc:[] as DocsTocEntry[]},[config?.freePlanProjectLimit,kind,item]);"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1673,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(kind==='blog') return <section className=\"texise-page-container texise-blog-detail-page\"><BlogArticle item={item}/></section>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1674,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <><div className=\"texise-page-container texise-docs-mobile-bar\"><DocsMobileNavigation items={docsIndex.items} activeSlug={slug}/></div><section className=\"texise-page-container texise-docs-layout\"><aside className=\"texise-docs-sidebar texise-docs-sidebar-desktop\">{docsIndex.error?<ErrorNotice>{docsIndex.error}</ErrorNotice>:null}{docsIndex.loading?<span className=\"texise-muted\">Loading docs…</span>:<DocsNavigation items={docsIndex.items} activeSlug={slug}/>}</aside><article className=\"tex"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1683,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <><MarketingPageHeading eyebrow=\"Docs\" title=\"Learnitive documentation.\" copy=\"Learn the editor, local project model, compilation, templates, AI and research workflows.\"/><div className=\"texise-page-container texise-docs-mobile-bar\"><DocsMobileNavigation items={items}/></div><section className=\"texise-page-container texise-docs-index\"><aside className=\"texise-docs-sidebar texise-docs-sidebar-desktop\"><label className=\"texise-docs-filter\"><span className=\"sr-only\">Filter documentati"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1685,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function EmptyCms({label}:{label:string}) { return <div className=\"texise-empty-state\"><BookOpen className=\"size-6\"/><h2>{label}</h2></div>; }"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1691,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <><MarketingPageHeading eyebrow=\"Contact\" title=\"Talk to Learnitive.\" copy=\"Send a support request. The message is stored as a support ticket and can notify the configured support mailbox.\"/><section className=\"texise-page-container texise-form-wrap\">{done?<div className=\"texise-success\"><Check className=\"size-5\"/><strong>Thanks. Your support ticket was created.</strong></div>:<form onSubmit={(event)=>void submit(event)}><div><Label htmlFor=\"contact-name\">Name</Label><Input id=\"con"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1694,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function PrivacyPage(){return <article className=\"texise-page-container texise-simple-page\"><h1 className=\"texise-display\">Privacy</h1><p>Learnitive is local first. Project files, compiled PDFs, Paper Memory documents and vectors, datasets, Git credentials, local AI models, vendor AI keys and filesystem handles are not automatically uploaded to the Learnitive account service. TexLab is an explicit authenticated server feature: only files you choose to send enter its isolated tempor"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1704,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <><MarketingPageHeading eyebrow=\"Free tools\" title=\"Small LaTeX tools that solve a complete task.\" copy=\"These utilities run in your browser and are designed to help before you open or continue a full Learnitive project.\"/><section className=\"texise-page-container texise-card-grid\">{PUBLIC_TOOLS.map((tool)=><a className=\"texise-marketing-card texise-use-case-card\" href={`/tools/${tool.slug}`} key={tool.slug}><FileCode2 className=\"size-5\"/><h2>{tool.title}</h2><p>{tool.summary}</p><"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1719,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <ToolShell title={keysOnly?'Citation Key Checker':'BibTeX Validator'} copy={keysOnly?PUBLIC_TOOLS[1].summary:PUBLIC_TOOLS[0].summary}><Label htmlFor=\"bibtex-tool-input\">Paste BibTeX</Label><textarea id=\"bibtex-tool-input\" className=\"texise-tool-textarea\" rows={14} value={input} onChange={(e)=>setInput(e.currentTarget.value)} placeholder=\"@article{smith2026, ...}\"/><div className=\"texise-tool-result\"><strong>{input.trim()?results.length?`${results.length} issue${results.length===1?'':'s'} "
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1722,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function LatexTableGeneratorTool(){const[input,setInput]=React.useState('Name\\tValue\\nAlpha\\t10\\nBeta\\t12');const[delimiter,setDelimiter]=React.useState<'tab'|'comma'|'pipe'>('tab');const output=React.useMemo(()=>{const sep=delimiter==='tab'?'\\t':delimiter==='comma'?',':'|';const rows=input.split(/\\r?\\n/u).filter(Boolean).map((row)=>row.split(sep).map((cell)=>cell.trim()));const cols=Math.max(1,...rows.map((row)=>row.length));const esc=(v:string)=>v.replace(/([%&#_$])/gu,'\\\\$1');return `\\\\begin{"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1734,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function LatexErrorDecoderTool(){const[input,setInput]=React.useState('');const match=React.useMemo(()=>LATEX_ERROR_RULES.find(([pattern])=>pattern.test(input)),[input]);return <ToolShell title=\"LaTeX Error Decoder\" copy={PUBLIC_TOOLS[3].summary}><Label htmlFor=\"latex-error-input\">Compiler error</Label><textarea id=\"latex-error-input\" className=\"texise-tool-textarea\" rows={9} value={input} onChange={(e)=>setInput(e.currentTarget.value)} placeholder=\"Paste the first meaningful LaTeX error here…\"/"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1735,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function ToolShell({title,copy,children}:{title:string;copy:string;children:React.ReactNode}){return <article className=\"texise-page-container texise-tool-page\"><header><a className=\"texise-text-link\" href=\"/tools\">← All tools</a><span className=\"texise-eyebrow\">Free browser tool</span><h1 className=\"texise-display\">{title}</h1><p>{copy}</p></header><section className=\"texise-tool-panel\">{children}</section><section className=\"texise-tool-cta\"><h2>Continue in Learnitive</h2><p>Open a loca"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1745,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <article className=\"texise-about-page\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1746,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<header className=\"texise-page-container texise-about-hero\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1747,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">About Learnitive</span>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1748,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h1 className=\"texise-display\">LaTeX research writing</h1>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1752,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<figure className=\"texise-page-container texise-about-team-image\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1753,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<img src=\"/texise-team.webp\" width=\"1672\" height=\"941\" alt=\"The Learnitive team collaborating around LaTeX research documents in a bright workspace\" loading=\"eager\" decoding=\"async\" />"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1756,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-about-section texise-about-mission\" aria-labelledby=\"about-mission-title\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1757,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Our mission</span>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1763,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-about-section\" aria-labelledby=\"about-why-title\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1764,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-about-section-heading\"><span className=\"texise-eyebrow\">Why we built Learnitive</span><h2 id=\"about-why-title\">Why Learnitive</h2></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1765,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-about-values\">{values.map((item) => { const Icon = item.icon; return <article key={item.title}><span className=\"texise-about-value-icon\"><Icon className=\"size-5\" aria-hidden=\"true\" /></span><h3>{item.title}</h3><p>{item.copy}</p></article>; })}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1768,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-about-section\" aria-labelledby=\"about-team-title\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1769,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<article className=\"texise-about-team-card\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1770,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><span className=\"texise-eyebrow\">The team</span><h2 id=\"about-team-title\">Learnitive Team</h2></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1775,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-about-section texise-about-portability\" aria-labelledby=\"about-portability-title\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1776,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Local first & transparent by design</span>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1779,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-about-links\"><a className=\"texise-text-link\" href=\"/features\">Explore features <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a><a className=\"texise-text-link\" href=\"/privacy\">Read our privacy approach <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1782,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-page-container texise-about-contact\" aria-labelledby=\"about-contact-title\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1783,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<span className=\"texise-eyebrow\">Get in touch</span>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1786,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<a className=\"texise-button texise-button-primary\" href=\"/contact\">Contact us <ArrowRight className=\"size-4\" aria-hidden=\"true\" /></a>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1839,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "return <section className=\"texise-settings-card texise-license-link-card\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1840,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<div className=\"texise-license-link-heading\"><span className=\"texise-eyebrow\">Learnitive Pro</span><h2>Link a Pro license</h2><p>Enter your Learnitive Pro license code to link it to this account. Lifetime, 1-month Payhip and eligible 10-digit activation codes are verified securely on the server.</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1841,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "{showCurrentPlan && entitlement ? <div className=\"texise-license-current-plan\"><span>Current plan</span><strong>{licensePlanLabel(entitlement)}</strong>{entitlement.license?.type === 'monthly' && entitlement.license.expiresAt && !entitlement.expired ? <small>Active until {new Date(entitlement.license.expiresAt).toLocaleDateString()}</small> : null}</div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1842,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "{linkedAccount ? <div className=\"texise-license-success\" role=\"status\"><Check className=\"size-4\" /><span>{linkedType === 'monthly' ? <>Pro Monthly activated. Pro is active until {linkedExpiry ? new Date(linkedExpiry).toLocaleDateString() : 'the license expiry date'}.</> : linkedType === 'lifetime' ? <>Pro Lifetime activated. Unlimited projects, clean PDF export and Priority support are now enabled.</> : <>Learnitive Pro activated for this account.</>}</span></div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1845,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "{licenseError ? <p className=\"texise-license-error\" role=\"alert\">{licenseError}</p> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1852,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-page-container texise-apply-page\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1853,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<header className=\"texise-apply-heading\"><span className=\"texise-eyebrow\">Learnitive Pro</span><h1 className=\"texise-display\">Apply your license.</h1><p>Use one secure form for a Pro Lifetime, 1-month Payhip or eligible 10-digit Learnitive activation code. Learnitive verifies the license on the server and links it to your account.</p></header>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1854,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "{loading ? <div className=\"texise-apply-loading\"><LoadingCard /></div> : auth.authenticated ? <div className=\"texise-apply-card-wrap\"><LicenseLinkCard inputId=\"apply-license-key\" showCurrentPlan /></div> : <div className=\"texise-apply-license-gate\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1855,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<div className=\"texise-apply-license-blurred\" aria-hidden=\"true\"><LicenseLinkCard inputId=\"apply-license-preview-key\" locked /></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1856,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<div className=\"texise-apply-login-overlay\"><span className=\"texise-eyebrow\">Account required</span><h2>Sign in to apply your license</h2><p>License codes are linked to a Learnitive account so Pro status can follow you securely.</p><a className=\"texise-button texise-apply-login-button\" href={`/login?returnTo=${encodeURIComponent('/apply')}`}><CircleUserRound className=\"size-4\" aria-hidden=\"true\" /> Login</a></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1858,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<p className=\"texise-apply-note\">The license key is sent only to Learnitive's authenticated verification endpoint and is never placed in the URL.</p>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1862,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function SimplePage({title,body}:{title:string;body:string}){return <article className=\"texise-page-container texise-simple-page\"><h1 className=\"texise-display\">{title}</h1><p>{body}</p></article>}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1864,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function ErrorNotice({children}:{children:React.ReactNode}){return <div className=\"texise-error\" role=\"alert\">{children}</div>}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 1866,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function SanitizedHtml({html,className=\"texise-prose\"}:{html:string;className?:string}) {"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2088,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"flex flex-wrap gap-2\">{publication?<Button variant=\"outline\" disabled={busy} onClick={()=>void act(async()=>{await unpublishProject(project.id);setPublication(undefined);await onChanged();toast.success('Project unpublished. Explicit members and share links remain separate.');})}>Unpublish</Button>:<Button disabled={busy||!workspace} title={workspace?'Create a signed-in community snapshot':'Open this project on this device to publish its local source.'} onClick={()=>void act(async"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2352,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className={`texise-projects-page${emptyProjects ? ' texise-projects-page--empty' : ''}`}>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2356,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-app-title-row\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2357,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><span className=\"texise-eyebrow\">Local first workspace</span><h1 className=\"texise-display\">Projects</h1><p>Create, import, link and reopen projects here. Manuscript files stay on this device unless you explicitly choose a local folder.</p>{projectUsageLabel ? <p className=\"texise-muted text-sm\">{projectUsageLabel}. Account metadata sync is optional.</p> : null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2358,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-project-primary-actions\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2361,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<DismissibleDetails className=\"texise-import-menu texise-project-more-menu\"><summary className=\"texise-icon-button\" aria-label=\"More project actions\"><MoreHorizontal className=\"size-4\" /></summary><div className=\"texise-import-popover\"><a href=\"/templates\"><LayoutTemplate className=\"size-4\" /> Templates</a><button type=\"button\" disabled={!supportsNativeFs()} onClick={() => void linkFolder()}><FolderOpen className=\"size-4\" /> Link Folder</button><button type=\"button\" onClick={() => setGitOpen(tru"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2364,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{loading ? <LoadingCard /> : <div className={`texise-project-list${emptyProjects ? ' texise-project-list--empty' : ''}`}>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2368,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <article key={`cloud:${project.id}`} className=\"texise-project-row texise-project-missing\" data-status={project.status}>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2369,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-project-icon\"><FolderOpen className=\"size-5\" /></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2370,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-project-copy\"><h2>{project.name}</h2><p>{project.storageType === 'linked-folder' ? 'Linked Folder' : project.storageType === 'browser' ? 'Browser project metadata' : 'Imported project metadata'} · Files are not linked on this device{project.lastOpenedAt ? ` · Opened ${relativeTime(project.lastOpenedAt)}` : ''}</p>{project.status === 'archived' ? <span className=\"texise-badge\">Archived</span> : null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2371,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-project-row-actions\">{project.storageType === 'linked-folder' ? <Button variant=\"outline\" disabled={!supportsNativeFs()} onClick={() => void linkFolder(project)}>Relink folder</Button> : <span className=\"texise-muted text-sm\">Files are not on this device</span>}<DismissibleDetails><summary className=\"texise-icon-button\" aria-label={`Account project actions for ${project.name}`}><MoreHorizontal className=\"size-4\" /></summary><div className=\"texise-row-menu\"><button type=\"bu"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2382,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <article key={`local:${workspace.name}`} className=\"texise-project-row\" data-status={project?.status || 'local'}>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2383,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-project-icon\"><FileCode2 className=\"size-5\" /></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2384,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-project-copy\"><a href={href} onClick={markOpened}><h2>{workspace.name}</h2></a><p>{note}</p>{project?.status === 'archived' ? <span className=\"texise-badge\">Archived</span> : null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2385,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-project-row-actions\"><a className=\"texise-button texise-button-secondary texise-button-sm\" href={href} onClick={markOpened}>Open</a><DismissibleDetails><summary className=\"texise-icon-button\" aria-label={`Project actions for ${workspace.name}`}><MoreHorizontal className=\"size-4\" /></summary><div className=\"texise-row-menu\"><button type=\"button\" onClick={() => void downloadProject(workspace)}><Download className=\"size-4\" /> Download ZIP</button><button type=\"button\" classNa"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2388,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{emptyProjects ? <div className=\"texise-empty-state texise-projects-empty-state\"><h2 className=\"texise-display\">Your projects start here.</h2><p className=\"texise-projects-empty-copy\">Create a local project, import a ZIP or GitHub repository, link a folder, or start from a template. To join live collaboration, open the Project link shared by its host.</p><div className=\"flex flex-wrap justify-center gap-2\"><Button variant=\"outline\" onClick={() => importRef.current?.click()}><Upload className=\"si"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2401,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <section className=\"texise-page-container space-y-6 py-8\"><header><span className=\"texise-eyebrow\">Authenticated community</span><h1 className=\"texise-display\">Explore projects</h1><p>Browse snapshots explicitly published by signed-in Learnitive users. Forking creates your own local-first project; it never edits the publisher's sandbox.</p></header>{error?<ErrorNotice>{error}</ErrorNotice>:null}{projects.length?<div className=\"grid gap-4 md:grid-cols-2 xl:grid-cols-3\">{projects.map"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2411,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "try { return localStorage.getItem('texise:preferred-project-storage') === 'native' ? 'native' : 'browser'; }"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2427,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "try { localStorage.setItem('texise:preferred-project-storage', value); } catch { /* optional local preference */ }"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2443,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-app-title-row\"><div><span className=\"texise-eyebrow\">Account</span><h1 className=\"texise-display\">Settings</h1><p>Safe account metadata only. Local project files remain outside the account service.</p></div></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2444,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-settings-grid\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2445,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-settings-card texise-settings-profile-card\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2447,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-profile-row\">{auth.user.avatarUrl ? <img src={auth.user.avatarUrl} alt=\"\" referrerPolicy=\"no-referrer\" /> : <CircleUserRound className=\"size-10\" />}<div><strong>{auth.user.email}</strong></div></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2450,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-account-metadata\" role=\"group\" aria-label=\"Account details\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2457,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-settings-entitlement-stack\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2458,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<section className=\"texise-settings-card\"><h2>Plan</h2><div className=\"texise-stat-line texise-stat-line-compact\"><span>Status</span><strong>{entitlementStatus}</strong></div><div className=\"texise-stat-line texise-stat-line-compact\"><span>Projects</span><strong>{projectAllowance}</strong></div><div className=\"texise-stat-line texise-stat-line-compact\"><span>PDF export</span><strong>{auth.entitlement.pro ? 'Clean' : 'Learnitive watermark'}</strong></div><div className=\"texise-stat-line te"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2461,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-settings-card\"><h2>Appearance</h2><div className=\"texise-segmented texise-settings-theme\">{(['system', 'light', 'dark'] as const).map((value) => <button type=\"button\" key={value} data-active={preference === value} onClick={() => void setTheme(value)}>{value}</button>)}</div><p className=\"texise-muted\">Theme is saved locally immediately and synchronised as safe account metadata when available.</p></section>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2462,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-settings-card\"><h2>Default project storage</h2><div className=\"texise-segmented texise-settings-theme\"><button type=\"button\" data-active={preferredStorage === 'browser'} onClick={() => void setStorage('browser')}>Browser Storage</button><button type=\"button\" data-active={preferredStorage === 'native'} disabled={!supportsNativeFs()} onClick={() => void setStorage('native')}>Local Folder</button></div><p className=\"texise-muted\">This preference controls the next project/"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2463,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-settings-card\"><h2>Development usage · 30 days</h2><div className=\"texise-stat-line texise-stat-line-compact\"><span>Sandbox starts / rebuilds</span><strong>{usageTotals.sandboxCreated} / {usageTotals.sandboxRecreated}</strong></div><div className=\"texise-stat-line texise-stat-line-compact\"><span>Agent tasks</span><strong>{usageTotals.aiTasks}</strong></div><div className=\"texise-stat-line texise-stat-line-compact\"><span>Commands / processes</span><strong>{usageTotals.c"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2464,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-settings-card\"><h2>Session</h2><Button variant=\"outline\" onClick={() => void logout().then(() => { window.location.href = '/'; })}><LogOut className=\"size-4\" /> Logout</Button></section>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2465,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-settings-card texise-danger-card\"><h2>Delete account</h2><p>Deletes or anonymizes SaaS account data and invalidates sessions. It does not delete project files from your device.</p><Button variant=\"destructive\" onClick={() => void remove()}>Delete account</Button></section>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2470,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function AuthRequired({title}:{title:string}){return <div className=\"texise-empty-state\"><CircleUserRound className=\"size-7\"/><h1 className=\"texise-display\">{title}</h1><a className=\"texise-button texise-button-primary\" href=\"/login\">Continue with Google</a><a className=\"texise-text-link\" href=\"/projects\">Continue locally</a></div>}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2473,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function AdminLoginPage(){const [email,setEmail]=React.useState('admin@learnitive.com');const [password,setPassword]=React.useState('');const [nextPassword,setNextPassword]=React.useState('');const [force,setForce]=React.useState(false);const [error,setError]=React.useState('');const login=async(e:React.FormEvent)=>{e.preventDefault();setError('');try{const result=await adminLogin(email,password);if(result.forcePasswordChange)setForce(true);else window.location.href='/admin'}catch(reason){"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2475,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "function AdminArea({pathname}:{pathname:string}){const {auth,loading}=useSaasSession();if(loading)return <div className=\"texise-admin-login\"><LoadingCard/></div>;if(!auth.authenticated||auth.user.role!=='admin'){window.location.replace('/admin/login');return null}if(auth.user.forcePasswordChange){window.location.replace('/admin/login');return null}let page:React.ReactNode;if(pathname==='/admin')page=<AdminDashboard/>;else if(pathname==='/admin/users')page=<AdminUsers/>;else if(pathname==='/admin"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2477,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function AdminPageHead({title,copy,actions}:{title:string;copy:string;actions?:React.ReactNode}){return <div className=\"texise-admin-page-head\"><div><h1 className=\"texise-display\">{title}</h1><p>{copy}</p></div>{actions?<div className=\"texise-admin-page-actions\">{actions}</div>:null}</div>}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2478,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function AdminDashboard(){const {data,error}=useAdminData<{metrics:Record<string,number>}>('/api/admin/dashboard');return <><AdminPageHead title=\"Dashboard\" copy=\"Account-layer operational metrics. No manuscript contents are included.\" actions={<a className=\"texise-button texise-button-secondary\" href=\"/admin/change-log\">Manage change log</a>}/>{error?<ErrorNotice>{error}</ErrorNotice>:null}<div className=\"texise-admin-metrics\">{data?Object.entries(data.metrics).map(([key,value])=><article key={"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2499,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{!data?<LoadingCard/>:<div className=\"space-y-5\">{data.plans.map((plan)=>{const form=forms[plan.planId]||plan.effective;return <section key={plan.planId} className=\"texise-admin-template-editor\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2500,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-editor-head\"><div><span className=\"texise-eyebrow\">Terminal entitlement</span><h2>{ADMIN_TERMINAL_PLAN_LABELS[plan.planId]||plan.planId}</h2><p>Current lifetime: {adminDuration(form.maxLifetimeSeconds)} · network: {form.networkMode==='packages-git'?'Packages + Git':form.networkMode}</p></div>{plan.updatedAt?<small>Last changed {new Date(plan.updatedAt).toLocaleString()}</small>:<small>Using deployment defaults</small>}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2501,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-grid\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2515,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-actions\"><Button disabled={busy===plan.planId} onClick={()=>void save(plan.planId)}>{busy===plan.planId?'Saving…':'Save terminal policy'}</Button></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2577,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const controls=<div className=\"texise-admin-learn-block-actions\"><button type=\"button\" onClick={()=>moveBlock(index,-1)} disabled={index===0}>↑</button><button type=\"button\" onClick={()=>moveBlock(index,1)} disabled={index===(lessonForm?.contentBlocks.length||0)-1}>↓</button><button type=\"button\" onClick={()=>removeBlock(index)}>Remove</button></div>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2578,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='rich-text'||block.type==='hint'||block.type==='solution'||block.type==='summary')return <article key={block.id} className=\"texise-admin-learn-block\"><header><strong>{block.type}</strong>{controls}</header><textarea className=\"texise-textarea\" rows={6} value={block.markdown} onChange={(e)=>updateBlock(index,{markdown:e.currentTarget.value})}/></article>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2579,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='heading')return <article key={block.id} className=\"texise-admin-learn-block\"><header><strong>Heading</strong>{controls}</header><div className=\"texise-admin-learn-inline\"><Input value={block.text} onChange={(e)=>updateBlock(index,{text:e.currentTarget.value})}/><select value={block.level} onChange={(e)=>updateBlock(index,{level:Number(e.currentTarget.value)})}><option value={2}>H2</option><option value={3}>H3</option><option value={4}>H4</option></select></div></article>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2580,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='callout')return <article key={block.id} className=\"texise-admin-learn-block\"><header><strong>Callout</strong>{controls}</header><select value={block.tone} onChange={(e)=>updateBlock(index,{tone:e.currentTarget.value as 'info'|'tip'|'warning'})}><option value=\"info\">Info</option><option value=\"tip\">Tip</option><option value=\"warning\">Warning</option></select><textarea className=\"texise-textarea\" rows={4} value={block.text} onChange={(e)=>updateBlock(index,{text:e.currentTarget.va"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2581,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='code-sample')return <article key={block.id} className=\"texise-admin-learn-block\"><header><strong>Code sample</strong>{controls}</header><Input value={block.language} onChange={(e)=>updateBlock(index,{language:e.currentTarget.value})}/><textarea className=\"texise-textarea\" rows={8} value={block.code} onChange={(e)=>updateBlock(index,{code:e.currentTarget.value})}/></article>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2582,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='interactive-editor')return <article key={block.id} className=\"texise-admin-learn-block\"><header><strong>Interactive editor</strong>{controls}</header><Input value={block.title||''} onChange={(e)=>updateBlock(index,{title:e.currentTarget.value})}/><textarea className=\"texise-textarea\" rows={4} value={block.instructions} onChange={(e)=>updateBlock(index,{instructions:e.currentTarget.value})}/></article>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2583,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='image')return <article key={block.id} className=\"texise-admin-learn-block\"><header><strong>Image</strong>{controls}</header><div className=\"texise-admin-learn-media-row\"><label className=\"texise-button texise-button-secondary\">Upload image<input hidden type=\"file\" accept=\"image/png,image/jpeg,image/webp\" onChange={(e)=>{const file=e.currentTarget.files?.[0];if(file)void uploadBlockMedia(index,'image',file);e.currentTarget.value=''}}/></label>{block.mediaId?<span>Media #{block.me"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2584,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if(block.type==='video')return <article key={block.id} className=\"texise-admin-learn-block texise-admin-learn-video-block\"><header><strong>Video</strong>{controls}</header><div className=\"texise-admin-learn-inline\"><div><Label>Source</Label><select value={block.sourceType} onChange={(e)=>{if(block.sourceType==='upload')queueMediaDelete(block.mediaId,block.posterMediaId,block.captionMediaId);updateBlock(index,{sourceType:e.currentTarget.value as 'upload'|'youtube'|'wistia',mediaId:undefined,poste"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2585,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <article key={block.id} className=\"texise-admin-learn-block\"><header><strong>{block.type}</strong>{controls}</header><p>This marker uses the lesson's structured {block.type} definition.</p></article>;"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2588,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<AdminPageHead title=\"Learn CMS\" copy=\"Create Free and Pro courses with controlled lesson blocks, interactive exercises and protected video. Runtime commands always come from the trusted project-mode catalog.\" actions={<><a className=\"texise-button texise-button-secondary\" href=\"/learn\" target=\"_blank\" rel=\"noreferrer\">Open Learn</a><Button onClick={()=>void createCourse()} disabled={busy}><Plus className=\"size-4\"/> New course</Button></>}/>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2590,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-layout\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2591,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<aside className=\"texise-admin-learn-courses\">{courses.map((course)=><button type=\"button\" key={course.id} data-active={course.id===selectedCourseId} onClick={()=>setSelectedCourseId(course.id)}><span><strong>{course.title}</strong><small>{course.accessTier.toUpperCase()} · {course.status} · {course.modules.reduce((count,module)=>count+module.lessons.length,0)} lessons</small></span><ChevronRight className=\"size-4\"/></button>)}{!courses.length?<p>No courses yet.</p>:null}</aside>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2592,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{courseForm?<section className=\"texise-admin-learn-editor\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2593,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-editor-actions\"><Button variant=\"outline\" onClick={()=>void validateCourse()} disabled={busy}>Validate</Button><Button variant=\"outline\" onClick={()=>void deleteCourse()} disabled={busy}>Delete</Button><Button onClick={()=>void saveCourse()} disabled={busy||courseForm.status==='published'&&!coursePublishReady(courseForm)}>Save course</Button></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2594,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-course-form\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2601,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-wide\"><Label>Summary</Label><textarea className=\"texise-textarea\" rows={2} value={courseForm.shortDescription} onChange={(e)=>setCourseForm({...courseForm,shortDescription:e.currentTarget.value})}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2602,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-wide\"><Label>Course description (Markdown)</Label><textarea className=\"texise-textarea\" rows={6} value={courseForm.descriptionMarkdown} onChange={(e)=>setCourseForm({...courseForm,descriptionMarkdown:e.currentTarget.value})}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2603,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><Label>Learning outcomes (one per line)</Label><textarea className=\"texise-textarea\" rows={4} value={courseForm.outcomes.join('\\n')} onChange={(e)=>setCourseForm({...courseForm,outcomes:e.currentTarget.value.split(/\\r?\\n/u).map(v=>v.trim()).filter(Boolean)})}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2604,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><Label>Prerequisites (one per line)</Label><textarea className=\"texise-textarea\" rows={4} value={courseForm.prerequisites.join('\\n')} onChange={(e)=>setCourseForm({...courseForm,prerequisites:e.currentTarget.value.split(/\\r?\\n/u).map(v=>v.trim()).filter(Boolean)})}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2605,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-wide\"><Label>Search tags (comma or line separated)</Label><Input value={(courseForm.tags||[]).join(', ')} onChange={(e)=>setCourseForm({...courseForm,tags:[...new Set(e.currentTarget.value.split(/[,\\n]/u).map(v=>v.trim()).filter(Boolean))]})}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2606,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-wide\"><Label>Course cover</Label><div className=\"texise-admin-learn-media-row\"><label className=\"texise-button texise-button-secondary\">{courseForm.coverImageUrl?'Replace cover':'Upload cover'}<input hidden type=\"file\" accept=\"image/png,image/jpeg,image/webp\" onChange={(e)=>{const file=e.currentTarget.files?.[0];if(file)void uploadCourseCover(file);e.currentTarget.value=''}}/></label>{courseForm.coverImageUrl?<><img src={courseForm.coverImageUrl} alt=\"Course co"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2608,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-section-head\"><div><h2>Modules & lessons</h2><p>Use controlled blocks for lesson content and media. Interactive lessons reuse canonical IDE modes and trusted runtime validation.</p></div><Button variant=\"outline\" onClick={()=>void addModule()}><Plus className=\"size-4\"/> Module</Button></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2609,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-module-tabs\">{courseForm.modules.map((module)=><button type=\"button\" key={module.id} data-active={module.id===selectedModuleId} onClick={()=>setSelectedModuleId(module.id)}>{module.title}</button>)}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2610,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{moduleForm?<div className=\"texise-admin-learn-module-editor\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2611,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-inline\"><div><Label>Module title</Label><Input value={moduleForm.title} onChange={(e)=>setModuleForm({...moduleForm,title:e.currentTarget.value})}/></div><div><Label>Slug</Label><Input value={moduleForm.slug} onChange={(e)=>setModuleForm({...moduleForm,slug:e.currentTarget.value})}/></div><div><Label>Sort</Label><Input type=\"number\" value={moduleForm.sortOrder} onChange={(e)=>setModuleForm({...moduleForm,sortOrder:Number(e.currentTarget.value)||0})}/></div><But"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2612,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-lessons\"><div className=\"texise-admin-learn-lesson-list\"><Button variant=\"outline\" onClick={()=>void addLesson()}><Plus className=\"size-4\"/> Lesson</Button>{moduleForm.lessons.map((lesson)=><button type=\"button\" key={lesson.id} data-active={lesson.id===selectedLessonId} onClick={()=>setSelectedLessonId(lesson.id)}><span><strong>{lesson.title}</strong><small>{lesson.lessonType} · {lesson.accessTier||'inherit'}{lesson.lessonType==='interactive'||lesson.lessonType"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2613,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{lessonForm?<div className=\"texise-admin-learn-lesson-editor\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2614,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-inline\"><div><Label>Lesson title</Label><Input value={lessonForm.title} onChange={(e)=>setLessonForm({...lessonForm,title:e.currentTarget.value})}/></div><div><Label>Slug</Label><Input value={lessonForm.slug} onChange={(e)=>setLessonForm({...lessonForm,slug:e.currentTarget.value})}/></div><div><Label>Type</Label><select value={lessonForm.lessonType} onChange={(e)=>setLessonForm({...lessonForm,lessonType:e.currentTarget.value})}><option value=\"lesson\">Lesson</op"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2615,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><Label>Legacy/base lesson Markdown</Label><textarea className=\"texise-textarea texise-cms-editor\" value={lessonForm.contentMarkdown} onChange={(e)=>setLessonForm({...lessonForm,contentMarkdown:e.currentTarget.value})}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2616,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-admin-learn-block-builder\"><div className=\"texise-admin-learn-section-head\"><div><h3>Lesson blocks</h3><p>Structured blocks are sanitized and ordered. Video accepts uploaded media, YouTube, or an Admin-managed Wistia ID; arbitrary iframe/script markup is not accepted.</p></div><div className=\"texise-admin-learn-add-block\"><select value={newBlockType} onChange={(e)=>setNewBlockType(e.currentTarget.value as LearnContentBlock['type'])}><option value=\"rich-text\">Rich text<"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2617,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{lessonForm.lessonType==='quiz'?<div className=\"texise-admin-learn-starter\"><h3>Quiz definition</h3><Label>Question</Label><textarea className=\"texise-textarea\" rows={3} value={typeof lessonForm.exercise?.question==='string'?lessonForm.exercise.question:''} onChange={(e)=>setLessonForm({...lessonForm,exercise:{...(lessonForm.exercise||{}),question:e.currentTarget.value}})}/><Label>Options (one per line)</Label><textarea className=\"texise-textarea\" rows={5} value={Array.isArray(lessonForm.exercis"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2618,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{lessonForm.lessonType==='exercise'?<div className=\"texise-admin-learn-starter\"><h3>Exercise validation</h3><Label>Expected stdout</Label><textarea className=\"texise-textarea\" rows={4} value={typeof lessonForm.exercise?.expectedStdout==='string'?lessonForm.exercise.expectedStdout:''} onChange={(e)=>setLessonForm({...lessonForm,exercise:{...(lessonForm.exercise||{}),expectedStdout:e.currentTarget.value}})}/><Label>Learner hint</Label><textarea className=\"texise-textarea\" rows={3} value={typeof le"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2619,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{lessonForm.lessonType==='interactive'||lessonForm.lessonType==='exercise'?<div className=\"texise-admin-learn-starter\"><div className=\"texise-admin-learn-section-head\"><div><h3>Interactive starter</h3><p>Files are learner source only; runtime commands remain application-controlled.</p></div><Button variant=\"outline\" onClick={()=>{const starter=canonicalStarter();if(starter)setLessonForm({...lessonForm,starter})}}>Use canonical starter</Button></div><textarea className=\"texise-textarea\" rows={12}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2620,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-validation\"><strong>Runtime validation: {lessonForm.validationStatus}</strong>{lessonForm.validationAt?<small>Checked {new Date(lessonForm.validationAt).toLocaleString()}</small>:null}{lessonForm.validationError?<pre>{lessonForm.validationError}</pre>:null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2621,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-learn-editor-actions\"><Button variant=\"outline\" onClick={()=>void showPreview('free')}>Preview as Free</Button><Button variant=\"outline\" onClick={()=>void showPreview('pro')}>Preview as Pro</Button><Button variant=\"outline\" onClick={()=>void validateLesson()}>{lessonForm.lessonType==='quiz'?'Validate quiz':'Validate runtime'}</Button><Button variant=\"outline\" onClick={()=>void deleteLesson()}>Delete lesson</Button><Button onClick={()=>void saveLesson()}>Save lesson</"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2622,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{preview?<section className=\"texise-admin-learn-preview\"><div className=\"texise-admin-learn-section-head\"><div><span className=\"texise-eyebrow\">Preview as {preview.tier==='pro'?'Pro':'Free'}</span><h3>{preview.lesson.title}</h3></div><button type=\"button\" className=\"texise-icon-button\" aria-label=\"Close preview\" onClick={()=>setPreview(undefined)}>×</button></div><LearnLessonContentPreview lesson={preview.lesson}/></section>:null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2625,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "</section>:<section className=\"texise-admin-learn-empty\"><BookOpen className=\"size-8\"/><h2>Create or select a course</h2><p>Courses can mix text, controlled media, interactive workspaces, quizzes and exercises.</p></section>}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2629,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function AdminPager({page,pageSize,total,onPage}:{page:number;pageSize:number;total:number;onPage:(page:number)=>void}){const pages=Math.max(1,Math.ceil(total/pageSize));if(pages<=1)return null;return <nav className=\"texise-admin-pager\" aria-label=\"Pagination\"><Button size=\"sm\" variant=\"outline\" disabled={page<=1} onClick={()=>onPage(page-1)}>Previous</Button><span>Page {page} of {pages} · {total} records</span><Button size=\"sm\" variant=\"outline\" disabled={page>=pages} onClick={()=>onPage(page+1"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2630,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function AdminListControls({search,onSearch,children}:{search:string;onSearch:(value:string)=>void;children?:React.ReactNode}){return <div className=\"texise-admin-list-controls\"><div className=\"texise-admin-search-field\"><Search className=\"size-4\"/><Input type=\"search\" value={search} onChange={(event)=>onSearch(event.currentTarget.value)} placeholder=\"Search\" aria-label=\"Search records\"/></div>{children}</div>}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2646,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "{rows.length?<div className=\"texise-admin-table-wrap\"><table className=\"texise-admin-table\"><thead><tr><th>User</th><th>Status</th><th>Projects</th><th>License</th><th>Support</th><th>Last login</th><th>Actions</th></tr></thead><tbody>{rows.map((row)=><tr key={String(row.id)}><td><div className=\"texise-admin-account-cell\">{row.avatar_url?<img className=\"texise-admin-avatar\" src={String(row.avatar_url)} alt=\"\" referrerPolicy=\"no-referrer\"/>:<CircleUserRound className=\"size-7\"/>}<span><strong>{Str"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2648,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "{selected?<article className=\"texise-user-detail\"><header><div><span className=\"texise-eyebrow\">Account #{String(selected.item.id)}</span><h2>{String(selected.item.display_name||selected.item.email||'User')}</h2><p>{String(selected.item.email||'')}</p></div><button type=\"button\" className=\"texise-icon-button\" aria-label=\"Close user detail\" onClick={()=>setSelected(undefined)}>×</button></header><dl><div><dt>Status</dt><dd>{String(selected.item.status||'')}</dd></div><div><dt>OAuth</dt><dd>{Strin"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2665,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "{rows.length?<div className=\"texise-admin-table-wrap\"><table className=\"texise-admin-table\"><thead><tr><th>License</th><th>Account</th><th>Provider</th><th>Type</th><th>Verified</th><th>Expires</th><th>Status</th><th>Actions</th></tr></thead><tbody>{rows.map((row)=><tr key={String(row.id)}><td><code>{String(row.license_key||'')}</code></td><td><strong>{String(row.display_name||'Unlinked')}</strong><br/><small>{String(row.email||'—')}</small></td><td>{String(row.provider||'—')}</td><td>{String(ro"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2678,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<AdminPageHead title={item.name} copy={`Private template preview · ${item.status === 'published' ? 'Published' : item.status === 'archived' ? 'Archived' : 'Draft'}`} actions={<><a className=\"texise-button texise-button-secondary\" href=\"/admin/templates\">Back to templates</a>{item.status==='published'?<a className=\"texise-button texise-button-secondary\" href={`/templates/${encodeURIComponent(item.slug)}`} target=\"_blank\" rel=\"noreferrer\">Open public page</a>:null}</>}/>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2679,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-template-detail texise-admin-template-private-preview\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2680,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-preview\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2681,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{item.previewResolved ? item.previewKind === 'pdf' ? <TemplatePdfPreview url={previewUrl} title={item.name}/> : <img src={previewUrl} alt={`${item.name} preview`}/> : <div className=\"texise-template-placeholder\"><FileText className=\"size-8\"/><span>No preview is available yet.</span></div>}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2683,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-detail-copy\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2684,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<div className=\"texise-card-meta\"><span>{item.category||'Uncategorised'}</span><span className={item.tier==='pro'?'texise-badge texise-badge-pro':'texise-badge'}>{item.tier==='pro'?'Pro':'Free'}</span><span>{provenance}</span><span>{item.status}</span></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2685,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<h1 className=\"texise-display\">{item.name}</h1>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2686,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{item.institution?<p className=\"texise-template-institution\">{item.institution}{item.degreeLevels?.length?` · ${item.degreeLevels.join(', ')}`:''}</p>:null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2688,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<dl className=\"texise-template-facts\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2692,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{item.features?.length?<section className=\"texise-template-features\"><h2>Template features</h2><ul>{item.features.map((feature)=><li key={feature}><Check className=\"size-4\"/> {feature}</li>)}</ul></section>:null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2693,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{item.requiredPackages?.length?<section className=\"texise-template-packages\"><h2>Required packages</h2><div className=\"texise-tag-row\">{item.requiredPackages.map((pkg)=><span key={pkg}>{pkg}</span>)}</div></section>:null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2694,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{item.tags?.length?<div className=\"texise-tag-row\">{item.tags.map((tag)=><span key={tag}>{tag}</span>)}</div>:null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 2695,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<aside className=\"texise-template-provenance-note\"><strong>Private Admin preview</strong><p>Draft and archived templates are intentionally absent from the public template manifest. Publish this template to make <code>/templates/{item.slug}</code> publicly resolvable.</p></aside>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3003,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<DialogContent className=\"sm:max-w-lg texise-admin-create-template-dialog\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3004,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<form onSubmit={(event)=>void createTemplate(event)} className=\"texise-admin-create-template-form\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3006,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-create-template-fields\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3012,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-create-template-file\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3016,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{createFile?<div className=\"texise-admin-create-template-file-selected\"><FileText className=\"size-4\"/><span><strong>{createFile.name}</strong><small>{(createFile.size/1024/1024).toFixed(createFile.size >= 1024 * 1024 ? 1 : 2)} MiB</small></span></div>:null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3025,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-metrics texise-template-admin-metrics\"><article><span>Total</span><strong>{counts.total}</strong></article><article><span>Free</span><strong>{counts.free}</strong></article><article><span>Pro</span><strong>{counts.pro}</strong></article><article><span>Published</span><strong>{counts.published}</strong></article></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3026,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-admin-template-toolbar\" aria-label=\"Template maintenance and bulk import\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3033,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-layout\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3036,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{checked.size ? <div className=\"texise-admin-bulk-bar\"><strong>{checked.size} selected</strong><select value={bulkInstitution} onChange={(event)=>setBulkInstitution(event.currentTarget.value)}><option value=\"\">Choose institution…</option><option value=\"__none__\">No institution</option>{(data?.institutions||[]).map((item)=><option key={item.id} value={item.id}>{item.displayName}</option>)}</select><Button size=\"sm\" variant=\"outline\" onClick={()=>void bulkPatch({institution:bulkInstitution==='__no"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3037,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-table-wrap\"><table className=\"texise-admin-table texise-admin-template-table\"><thead><tr><th><input type=\"checkbox\" aria-label=\"Select all visible templates\" checked={allVisibleChecked} onChange={toggleAllVisible}/></th><th aria-sort={sortAria('name')}><button type=\"button\" className=\"texise-admin-sort-button\" onClick={()=>changeSort('name')}>Template <span aria-hidden=\"true\">{sortIndicator('name')}</span></button></th><th aria-sort={sortAria('tier')}><button type=\"b"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3039,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section ref={editorRef} className=\"texise-admin-template-editor\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3041,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-editor-head\"><div><span className=\"texise-eyebrow\">Template editor</span><h2>{form.name}</h2><code>{form.tier}/{selectedSlug}/template.json</code></div><div className=\"texise-admin-template-editor-links\"><a className=\"texise-button texise-button-secondary texise-button-sm\" href={`/admin/templates/preview/${encodeURIComponent(selectedSlug)}`} target=\"_blank\" rel=\"noreferrer\">Preview template</a>{form.status==='published'?<a className=\"texise-button texise-but"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3042,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-grid\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3053,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span\"><strong>Legacy LaTeX / academic discovery metadata</strong><p className=\"texise-muted\">Institution and document category are preserved for academic LaTeX templates. They do not control runtime behavior.</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3054,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><Label>Legacy category</Label><select value={form.categoryId||''} onChange={(e)=>{const id=e.currentTarget.value;const category=(data?.categories||[]).find((item)=>item.id===id);setForm((current)=>current?({...current,categoryId:id,category:category?.name||''}):current)}}><option value=\"\">Uncategorised</option>{(data?.categories||[]).filter((item)=>item.status!=='archived'||item.id===form.categoryId).map((item)=><option key={item.id} value={item.id}>{item.name}{item.status!=='published'?` ("
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3055,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div><Label>Academic institution</Label><select value={form.institution||''} onChange={(e)=>{const id=e.currentTarget.value;const inst=(data?.institutions||[]).find((item)=>item.id===id);setForm((current)=>current?{...current,institution:id,country:current.country||inst?.country||'',countryCode:current.countryCode||inst?.countryCode||'',region:current.region||inst?.region||''}:current)}}><option value=\"\">None</option>{(data?.institutions||[]).map((item)=><option key={item.id} value={item.id}>{it"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3065,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<div><Label>Provenance</Label><select value={form.provenance||'texise'} onChange={(e)=>patchForm('provenance',e.currentTarget.value as AdminTemplateRecord['provenance'])}><option value=\"texise\">Learnitive-created</option><option value=\"official\">Official source</option><option value=\"adapted\">Adapted</option><option value=\"community\">Community</option></select></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3068,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span\"><Label>Source URL</Label><Input type=\"url\" value={form.sourceUrl||''} onChange={(e)=>patchForm('sourceUrl',e.currentTarget.value)}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3077,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span texise-admin-template-preview-upload texise-admin-template-thumbnail-upload\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3078,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-preview-upload-head\"><div><Label>Catalog thumbnail</Label><p>Upload PNG, JPEG or WebP up to 5 MB. A4 portrait artwork is recommended. When no custom thumbnail is set, Learnitive uses the default A4 thumbnail automatically.</p></div><div className=\"texise-admin-template-preview-actions\"><input ref={thumbnailRef} type=\"file\" accept=\"image/png,image/jpeg,image/webp\" className=\"sr-only\" onChange={(event)=>void uploadThumbnail(event.currentTarget.files?.[0"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3079,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-preview-media texise-admin-template-thumbnail-media\"><img src={form.thumbnail ? `/api/templates/${encodeURIComponent(selectedSlug)}/assets/thumbnail` : DEFAULT_TEMPLATE_THUMBNAIL_URL} alt={form.thumbnail ? `${form.name} catalog thumbnail` : 'Default Learnitive template thumbnail'} /><p>{form.thumbnail ? <>Custom thumbnail: <code>{form.thumbnail}</code></> : <>Default catalog thumbnail: <code>texise-template-default-thumbnail.webp</code></>}</p></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3081,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span texise-admin-template-preview-upload\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3082,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-preview-upload-head\"><div><Label>Template preview</Label><p>Upload PNG, JPEG, WebP or PDF (up to 20 MB). If no explicit preview is set, Learnitive automatically uses <code>template.pdf</code> or <code>main.pdf</code> when present.</p></div><div className=\"texise-admin-template-preview-actions\"><input ref={previewRef} type=\"file\" accept=\"image/png,image/jpeg,image/webp,application/pdf,.pdf\" className=\"sr-only\" onChange={(event)=>void uploadPreview(even"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3083,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{form.previewResolved ? <div className=\"texise-admin-template-preview-media\">{form.previewKind === 'pdf' ? <TemplatePdfPreview url={`/api/templates/${encodeURIComponent(selectedSlug)}/assets/preview`} title={form.name}/> : <img src={`/api/templates/${encodeURIComponent(selectedSlug)}/assets/preview`} alt={`${form.name} preview`} />}<p>{form.previewAutomatic ? <>Automatic fallback: <code>{form.previewResolved}</code></> : <>Explicit preview: <code>{form.previewResolved}</code></>}</p></div> : <di"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3085,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span\"><Label>Description</Label><textarea value={form.description||''} onChange={(e)=>patchForm('description',e.currentTarget.value)} rows={3}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3086,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span\"><Label>Long description</Label><textarea value={form.longDescription||''} onChange={(e)=>patchForm('longDescription',e.currentTarget.value)} rows={5}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3087,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span\"><Label>Features — one per line</Label><textarea value={adminLines(form.features)} onChange={(e)=>patchForm('features',parseAdminList(e.currentTarget.value))} rows={5}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3088,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span\"><Label>Required packages</Label><textarea value={adminCsv(form.requiredPackages)} onChange={(e)=>patchForm('requiredPackages',parseAdminList(e.currentTarget.value))} rows={3}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3089,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span\"><Label>Tags / searchable keywords</Label><textarea value={adminCsv(form.tags)} onChange={(e)=>patchForm('tags',parseAdminList(e.currentTarget.value))} rows={3}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3090,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "<div className=\"texise-admin-form-span\"><Label>Attribution</Label><textarea value={form.attribution||''} onChange={(e)=>patchForm('attribution',e.currentTarget.value)} rows={3}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3091,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span\"><Label>SEO title</Label><Input value={form.seoTitle||''} onChange={(e)=>patchForm('seoTitle',e.currentTarget.value)}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3092,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span\"><Label>SEO description</Label><textarea value={form.seoDescription||''} onChange={(e)=>patchForm('seoDescription',e.currentTarget.value)} rows={3}/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3093,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<label className=\"texise-admin-check\"><input type=\"checkbox\" checked={Boolean(form.noIndex)} onChange={(e)=>patchForm('noIndex',e.currentTarget.checked)}/> Noindex this template page</label>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3095,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-actions\"><Button disabled={busy} onClick={()=>void save()}>Save template</Button><Button variant=\"outline\" disabled={busy} onClick={()=>void validateSelected()}>Validate Template</Button><input ref={replaceRef} type=\"file\" accept=\".zip,application/zip\" className=\"sr-only\" onChange={(event)=>void replaceZip(event.currentTarget.files)}/><Button variant=\"outline\" disabled={busy} onClick={()=>replaceRef.current?.click()}>Replace ZIP</Button><Button variant=\"outl"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3096,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "</> : <div className=\"texise-empty-state\"><LayoutTemplate className=\"size-8\"/><h2>Select a template</h2><p>Choose a template to manage its trusted project mode, discovery metadata, validation state, source archive and publication status.</p></div>}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3164,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-layout texise-admin-category-layout\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3165,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-admin-table-wrap\"><table className=\"texise-admin-table\"><thead><tr>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3166,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<th aria-sort={ariaSort('name')}><button type=\"button\" className=\"texise-admin-sort-button\" onClick={()=>changeSort('name')}>Category <span>{indicator('name')}</span></button></th>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3168,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<th aria-sort={ariaSort('status')}><button type=\"button\" className=\"texise-admin-sort-button\" onClick={()=>changeSort('status')}>Status <span>{indicator('status')}</span></button></th>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3169,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<th aria-sort={ariaSort('templates')}><button type=\"button\" className=\"texise-admin-sort-button\" onClick={()=>changeSort('templates')}>Templates <span>{indicator('templates')}</span></button></th>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3170,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<th aria-sort={ariaSort('sortOrder')}><button type=\"button\" className=\"texise-admin-sort-button\" onClick={()=>changeSort('sortOrder')}>Order <span>{indicator('sortOrder')}</span></button></th>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3171,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<th aria-sort={ariaSort('createdAt')}><button type=\"button\" className=\"texise-admin-sort-button\" onClick={()=>changeSort('createdAt')}>Created <span>{indicator('createdAt')}</span></button></th>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3172,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<th aria-sort={ariaSort('updatedAt')}><button type=\"button\" className=\"texise-admin-sort-button\" onClick={()=>changeSort('updatedAt')}>Updated <span>{indicator('updatedAt')}</span></button></th><th/>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3173,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "</tr></thead><tbody>{rows.map((item)=><tr key={item.id} data-selected={selected===item.id}><td><strong>{item.name}</strong><br/><code>{item.id}</code></td><td><span className=\"texise-admin-category-icon-cell\"><TemplateCategoryIcon name={item.icon} className=\"size-5\"/> {item.icon || 'Default'}</span></td><td>{item.status}</td><td>{data?.counts[item.id]||0}</td><td>{item.sortOrder}</td><td>{formatDate(item.createdAt)}</td><td>{formatDate(item.updatedAt)}</td><td><button type=\"button\" className=\"te"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3174,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-admin-template-editor texise-admin-category-editor\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3175,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-editor-head\"><div><span className=\"texise-eyebrow\">Category editor</span><h2>{selected ? form.name : 'Create category'}</h2><p>Stable IDs keep category URLs and template assignments intact when the display name changes.</p></div></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3176,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-grid\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3181,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span\"><Label htmlFor=\"template-category-description\">Description</Label><textarea id=\"template-category-description\" rows={4} value={form.description||''} onChange={(event)=>{const description=event.currentTarget.value;setForm((current)=>({...current,description}))}} placeholder=\"Explain what belongs in this document category.\"/></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3182,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-span texise-admin-category-icon-field\"><div><Label>Lucide icon</Label><p>Choose visually from the full Lucide library. Only the canonical icon name is stored.</p></div><div className=\"texise-admin-category-icon-choice\"><span><TemplateCategoryIcon name={form.icon} className=\"size-6\"/> {form.icon || 'Default FileText'}</span><Button type=\"button\" variant=\"outline\" onClick={()=>setIconOpen(true)}>Browse icons</Button></div></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3184,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-category-card-preview\"><span className=\"texise-eyebrow\">Live public card preview</span><div className=\"texise-template-category-card\"><div className=\"texise-template-category-card-copy\"><span className=\"texise-template-category-icon\"><TemplateCategoryIcon name={form.icon} className=\"size-6\"/></span><span>{selected ? `${data?.counts[selected]||0} templates` : '0 templates'}</span><h3>{form.name || 'Category name'}</h3><p>{form.description || 'Category description will"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3185,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-actions\"><Button disabled={busy} onClick={()=>void save()}>{selected?'Save category':'Create category'}</Button>{selected?<Button variant=\"destructive\" disabled={busy} onClick={()=>void remove()}><Trash2 className=\"size-4\"/> Delete category</Button>:null}</div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3188,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{iconOpen ? <React.Suspense fallback={<div className=\"texise-category-icon-loading\" role=\"status\">Loading Lucide icon browser…</div>}><TemplateCategoryIconBrowser open value={form.icon} onSelect={(icon)=>setForm((current)=>({...current,icon}))} onClose={()=>setIconOpen(false)}/></React.Suspense> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3232,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<AdminPageHead title=\"Change log\" copy=\"Edit the public Change log page and publish dated product changes. Draft events remain private.\" actions={<a className=\"texise-button texise-button-secondary\" href=\"/change-log\" target=\"_blank\" rel=\"noreferrer\">View public page</a>}/>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3234,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-admin-change-log-settings\"><div><span className=\"texise-eyebrow\">Public page</span><h2>Page content</h2><p>The heading and introduction are stored in the database and can be changed without a deployment.</p></div><div className=\"texise-admin-form-grid\"><div className=\"texise-admin-form-span\"><Label htmlFor=\"change-log-page-title\">Page title</Label><Input id=\"change-log-page-title\" value={settings.title || ''} onChange={(event)=>setSettings((current)=>({...current,title"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3235,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-layout texise-admin-change-log-layout\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3236,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-admin-table-wrap\"><table className=\"texise-admin-table\"><thead><tr><th>Change date</th><th>Change</th><th>Status</th><th/></tr></thead><tbody>{(data?.items || []).map((item)=><tr key={item.id}><td><time dateTime={item.change_date}>{item.change_date.slice(0,10)}</time></td><td><strong>{item.title}</strong></td><td>{item.status}</td><td><button type=\"button\" onClick={()=>edit(item)}>Edit</button></td></tr>)}</tbody></table>{data && data.items.length===0 ? <div className="
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3237,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-admin-template-editor\"><div className=\"texise-admin-template-editor-head\"><div><span className=\"texise-eyebrow\">{selected ? 'Edit change' : 'New change'}</span><h2>{form.title || 'Change event'}</h2></div>{selected ? <Button size=\"sm\" variant=\"outline\" onClick={reset}>New</Button> : null}</div><div className=\"texise-admin-form-grid\"><div><Label htmlFor=\"change-log-date\">Change date</Label><Input id=\"change-log-date\" type=\"date\" value={form.change_date.slice(0,10)} onCh"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3258,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-template-layout texise-admin-institution-layout\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3259,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-admin-table-wrap\"><table className=\"texise-admin-table\"><thead><tr><th>Institution</th><th>Country</th><th>Region</th><th>Status</th><th/></tr></thead><tbody>{(data?.institutions||[]).map((item)=><tr key={item.id}><td><div className=\"texise-admin-institution-list-name\">{item.logo?<img src={`/api/templates/institutions/${encodeURIComponent(item.id)}/logo`} alt=\"\"/>:null}<div><strong>{item.displayName}</strong><br/><code>{item.id}</code></div></div></td><td>{item.country"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3260,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-admin-template-editor\"><div className=\"texise-admin-template-editor-head\"><div><span className=\"texise-eyebrow\">{selected?'Edit institution':'New institution'}</span><h2>{form.displayName||'Academic institution'}</h2></div>{selected?<Button size=\"sm\" variant=\"outline\" onClick={()=>{setSelected('');setForm(blank())}}>New</Button>:null}</div><div className=\"texise-admin-form-grid\"><div><Label>ID / slug</Label><Input disabled={Boolean(selected)} value={form.id} onChange={"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3266,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function AdminSupport(){const [page,setPage]=React.useState(1);const [search,setSearch]=React.useState('');const [status,setStatus]=React.useState('');const [selected,setSelected]=React.useState<Record<string,unknown>>();const path=`/api/admin/support?page=${page}&pageSize=25&search=${encodeURIComponent(search)}&status=${encodeURIComponent(status)}`;const {data,error,refresh}=useAdminData<{items:Array<Record<string,unknown>>;page:number;pageSize:number;total:number}>(path);const update=async(id:"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3267,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function AdminTable({rows,actions}:{rows:Array<Record<string,unknown>>;actions?:(row:Record<string,unknown>)=>React.ReactNode}){if(!rows.length)return <div className=\"texise-empty-state\"><p>No records.</p></div>;const keys=Object.keys(rows[0]||{}).slice(0,8);return <div className=\"texise-admin-table-wrap\"><table className=\"texise-admin-table\"><thead><tr>{keys.map((key)=><th key={key}>{key}</th>)}{actions?<th>Actions</th>:null}</tr></thead><tbody>{rows.map((row,index)=><tr key={String(row.id??ind"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3404,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className={`texise-admin-cms${kind === 'blog' ? ' texise-admin-blog-cms' : ''}`}>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3407,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-grid\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3410,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{kind === 'blog' ? <div className=\"texise-admin-form-wide\"><Label>Excerpt</Label><Input value={form.excerpt} onChange={(event) => setForm({ ...form, excerpt: event.currentTarget.value })} /></div> : <>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3414,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-form-wide\"><Label>Tags</Label><Input value={form.tags} onChange={(event) => setForm({ ...form, tags: event.currentTarget.value })} placeholder=\"research, latex, updates\" /></div>"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3416,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{kind === 'blog' ? <section className=\"texise-blog-cover-admin\">"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3417,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-blog-cover-admin-head\"><div><h3>Cover image</h3><p>PNG, JPEG or WebP. Recommended 1600×840 (1.91:1); minimum 1200×630 and up to 8 MB. Keep important text and subjects near the centre because Blog cards may crop the edges. Uploads are staged in /var/www/learnitive.com/texise-media and republished into dist on every install/build.</p></div><label className=\"texise-button texise-button-secondary texise-button-sm\">{uploading ? 'Uploading…' : form.coverImageUrl ? 'Replace"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3418,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{form.coverImageUrl ? <div className=\"texise-blog-cover-admin-preview\"><img src={form.coverImageUrl} alt={form.coverImageAlt || ''} /><Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => setForm({ ...form, coverImageUrl: '', coverImageAlt: '', coverImageWidth: 0, coverImageHeight: 0 })}>Remove</Button></div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3422,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{kind === 'blog' ? <ToastBlogEditor value={form.contentMarkdown} onChange={(contentMarkdown) => { setForm((current) => ({ ...current, contentMarkdown })); setPreview(''); }} onUploadImage={uploadBodyMedia} /> : <><div className=\"texise-inline-form\"><label className=\"texise-button texise-button-secondary texise-button-sm\">{mediaUploading ? 'Uploading…' : 'Insert image'}<input type=\"file\" accept=\"image/png,image/jpeg,image/webp\" disabled={mediaUploading} className=\"sr-only\" onChange={(event) => { "
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3423,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-publish-row\"><div><Label>Status</Label><select value={form.status} onChange={(event) => setForm({ ...form, status: event.currentTarget.value })}><option value=\"draft\">Draft</option><option value=\"published\">Published</option></select></div><div className=\"texise-inline-form\"><Button type=\"submit\">{editing ? 'Save changes' : 'Create'}</Button><Button type=\"button\" variant=\"outline\" onClick={() => void renderPreview()}>Preview</Button>{editing ? <Button type=\"button\" v"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3424,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{preview ? <article className=\"texise-cms-preview\"><div className=\"texise-eyebrow\">Safe preview</div>{kind === 'blog' && form.coverImageUrl ? <img className=\"texise-blog-article-cover\" src={form.coverImageUrl} alt={form.coverImageAlt} /> : null}<SanitizedHtml html={preview} /></article> : null}"
    },
    {
      "path": "packages/core/app/src/saas/saas-app.tsx",
      "line": 3426,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-admin-cms-list\">{(data?.items || []).map((item) => <article key={String(item.id)}>{kind === 'blog' && item.cover_image_url ? <img src={String(item.cover_image_url)} alt=\"\" /> : null}<div><strong>{String(item.title)}</strong><span>{String(item.status)} · /{kind}/{String(item.slug)}</span></div><div><Button size=\"sm\" variant=\"outline\" onClick={() => void edit(Number(item.id))}>Edit</Button><Button size=\"sm\" variant=\"ghost\" onClick={() => void del(Number(item.id))}>Delete</Bu"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon-browser.tsx",
      "line": 5,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const RECENT_KEY = 'texise.admin.template-category-icons.recent';"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon-browser.tsx",
      "line": 7,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CATALOG_URL = '/texise-icons/lucide-category-icons.json';"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon-browser.tsx",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const SPRITE_URL = '/texise-icons/lucide-category-icons.svg';"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon-browser.tsx",
      "line": 32,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <button type=\"button\" role=\"option\" aria-selected={selected} aria-label={icon.name} className=\"texise-category-icon-tile\" data-selected={selected} onClick={() => onChoose(icon.name)} title={icon.name}>"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon-browser.tsx",
      "line": 81,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <Dialog open={open} onOpenChange={(next) => { if (!next) onClose(); }}><DialogContent className=\"texise-category-icon-dialog\">"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon-browser.tsx",
      "line": 83,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-category-icon-search\"><Search className=\"size-4\"/><Input value={query} onChange={(event) => { const next = event.currentTarget.value; setQuery(next); setLimit(PAGE_SIZE); }} aria-label=\"Search Lucide icons\" placeholder=\"Search icons, e.g. book, flask, presentation…\" autoFocus/><Button size=\"sm\" variant=\"ghost\" onClick={() => setQuery('')} aria-label=\"Clear icon search\"><X className=\"size-4\"/></Button></div>"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon-browser.tsx",
      "line": 84,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-category-icon-groups\" role=\"tablist\" aria-label=\"Icon groups\">{groups.map((item) => <button type=\"button\" role=\"tab\" aria-selected={group === item} key={item} data-active={group === item} onClick={() => { setGroup(item); setLimit(PAGE_SIZE); }}>{item}</button>)}</div>"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon-browser.tsx",
      "line": 85,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{loadError ? <div className=\"texise-empty-state\" role=\"alert\"><p>{loadError}</p></div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon-browser.tsx",
      "line": 86,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{!loadError && !icons.length ? <div className=\"texise-category-icon-loading\" role=\"status\">Loading icon catalog…</div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon-browser.tsx",
      "line": 87,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-category-icon-grid\" role=\"listbox\" aria-label=\"Lucide icons\">{visible.map((icon) => <IconTile key={icon.name} icon={icon} selected={value === icon.name} onChoose={choose}/>)}</div>"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon-browser.tsx",
      "line": 88,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{icons.length > 0 && !visible.length ? <div className=\"texise-empty-state\"><p>No Lucide icons match this search.</p></div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon.tsx",
      "line": 14,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const url = `/texise-icons/lucide/${encodeURIComponent(assetName)}.svg`;"
    },
    {
      "path": "packages/core/app/src/saas/template-category-icon.tsx",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className={`${className} texise-static-lucide-icon`}"
    },
    {
      "path": "packages/core/app/src/saas/template-pdf-preview.tsx",
      "line": 111,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return <div className={`texise-template-pdfjs${compact ? ' is-compact' : ''}`}>"
    },
    {
      "path": "packages/core/app/src/saas/template-pdf-preview.tsx",
      "line": 112,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{!compact ? <div className=\"texise-template-pdfjs-toolbar\" role=\"toolbar\" aria-label=\"PDF preview controls\">"
    },
    {
      "path": "packages/core/app/src/saas/template-pdf-preview.tsx",
      "line": 113,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-pdfjs-page-controls\">"
    },
    {
      "path": "packages/core/app/src/saas/template-pdf-preview.tsx",
      "line": 118,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-pdfjs-zoom-controls\">"
    },
    {
      "path": "packages/core/app/src/saas/template-pdf-preview.tsx",
      "line": 123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<a className=\"texise-button texise-button-secondary texise-button-sm\" href={url} target=\"_blank\" rel=\"noreferrer\"><ExternalLink className=\"size-4\"/> Open PDF</a>"
    },
    {
      "path": "packages/core/app/src/saas/template-pdf-preview.tsx",
      "line": 126,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-template-pdfjs-frame\" ref={frameRef} aria-busy={loading || rendering}>"
    },
    {
      "path": "packages/core/app/src/saas/template-pdf-preview.tsx",
      "line": 127,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{loading ? <div className=\"texise-template-pdfjs-state\">Loading PDF preview…</div> : null}"
    },
    {
      "path": "packages/core/app/src/saas/template-pdf-preview.tsx",
      "line": 128,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{error ? <div className=\"texise-template-pdfjs-state is-error\"><strong>PDF preview unavailable.</strong><span>{error}</span><a className=\"texise-text-link\" href={url} target=\"_blank\" rel=\"noreferrer\">Open PDF</a></div> : null}"
    },
    {
      "path": "packages/core/command-handlers/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/core/command-handlers/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/core/command-handlers/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/core/command-handlers/src/__tests__/command-handlers.spec.ts",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "import { texiseAppCommands } from '@learnitive/commands';"
    },
    {
      "path": "packages/core/command-handlers/src/__tests__/command-handlers.spec.ts",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const commandIds = texiseAppCommands.map((c) => c.id);"
    },
    {
      "path": "packages/core/command-handlers/src/__tests__/command-handlers.spec.ts",
      "line": 20,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const commandIds = new Set(texiseAppCommands.map((c) => c.id));"
    },
    {
      "path": "packages/core/command-handlers/src/ui-handlers/note-management.ts",
      "line": 501,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const ROOT_ID = '<{texise_root}>';"
    },
    {
      "path": "packages/core/context/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/core/context/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/core/context/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/core/editor/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/core/editor/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/core/editor/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/core/editor/src/__tests__/local-image-node-view.spec.ts",
      "line": 79,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(nodeView.dom.classList.contains('texise-local-image-broken')).toBe("
    },
    {
      "path": "packages/core/editor/src/__tests__/round-trip-check.spec.ts",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['link', '[TeXise](https://www.texise.com)\\n'],"
    },
    {
      "path": "packages/core/editor/src/__tests__/table-markdown.spec.ts",
      "line": 79,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['| link |', '| --- |', '| [TeXise](https://www.texise.com) |'].join('\\n'),"
    },
    {
      "path": "packages/core/editor/src/__tests__/wiki-link-markdown.spec.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'before[[texise.com]]after',"
    },
    {
      "path": "packages/core/editor/src/local-image-node-view.ts",
      "line": 93,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "this.dom.classList.remove('texise-local-image-broken');"
    },
    {
      "path": "packages/core/editor/src/local-image-node-view.ts",
      "line": 126,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "this.dom.classList.remove('texise-local-image-broken');"
    },
    {
      "path": "packages/core/editor/src/local-image-node-view.ts",
      "line": 149,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "this.dom.classList.add('texise-local-image-broken');"
    },
    {
      "path": "packages/core/editor/src/typography.css",
      "line": 168,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "&.texise-link-open-modifier a {"
    },
    {
      "path": "packages/core/editor/src/typography.css",
      "line": 172,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "& img.texise-local-image-broken {"
    },
    {
      "path": "packages/core/editor-w/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/core/editor-w/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/core/editor-w/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/core/initialize-services/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/core/initialize-services/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/core/initialize-services/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/core/initialize-services/src/__tests__/service-setup.spec.ts",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "import { texiseAppCommands } from '@learnitive/commands';"
    },
    {
      "path": "packages/core/initialize-services/src/__tests__/service-setup.spec.ts",
      "line": 43,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "commands: texiseAppCommands,"
    },
    {
      "path": "packages/core/initialize-services/src/__tests__/service-setup.spec.ts",
      "line": 193,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "commands: texiseAppCommands,"
    },
    {
      "path": "packages/core/initialize-services/src/__tests__/service-setup.spec.ts",
      "line": 246,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const [excludedCommand] = texiseAppCommands;"
    },
    {
      "path": "packages/core/initialize-services/src/__tests__/service-setup.spec.ts",
      "line": 254,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "commands: texiseAppCommands,"
    },
    {
      "path": "packages/core/initialize-services/src/index.ts",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "import { texiseAppCommands } from '@learnitive/commands';"
    },
    {
      "path": "packages/core/initialize-services/src/index.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texiseAppCommands,"
    },
    {
      "path": "packages/core/initialize-services/src/index.ts",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "new URLSearchParams(window.location.search).get('texiseLiveDraftProbe') ==="
    },
    {
      "path": "packages/core/initialize-services/src/index.ts",
      "line": 66,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "__texiseLiveDraftProbe?: {"
    },
    {
      "path": "packages/core/initialize-services/src/index.ts",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "target.__texiseLiveDraftProbe = {"
    },
    {
      "path": "packages/core/initialize-services/src/initialize-services.ts",
      "line": 189,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "`Unsupported TeXise project storage type: ${workspace.type}`,"
    },
    {
      "path": "packages/core/omni-search/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/core/omni-search/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/core/omni-search/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/core/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texiseWorkspaceConfig\": {"
    },
    {
      "path": "packages/core/service-core/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/core/service-core/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/core/service-core/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/core/service-core/src/__tests__/ai-structured-output.spec.ts",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "expect(parseRecoverableAiJson('```json\\n[TEXISE_JSON]\\n{\"replacement\":\"clear text\",\"confidence\":0.9}\\n```')).toEqual({ replacement: 'clear text', confidence: 0.9 });"
    },
    {
      "path": "packages/core/service-core/src/__tests__/command-dispatch-service.spec.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "import { texiseAppCommands } from '@learnitive/commands';"
    },
    {
      "path": "packages/core/service-core/src/__tests__/command-dispatch-service.spec.ts",
      "line": 190,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const command = texiseAppCommands.find("
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-local-reliability.spec.ts",
      "line": 78,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const request = indexedDB.deleteDatabase('texise-ai-credentials-v1');"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-local-reliability.spec.ts",
      "line": 123,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(JSON.parse(localStorage.getItem('texise:ai:settings:v1') ?? '{}')).toMatchObject({ localModelId: selected });"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-local-reliability.spec.ts",
      "line": 320,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(localStorage.getItem('texise:ai:remembered-api-key:v1')).toBeNull();"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 110,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const request = indexedDB.open('texise-ai-writing-v1', 1);"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 170,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const response = String.raw`[TEXISE_REPLACEMENT_BEGIN]"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 172,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[TEXISE_REPLACEMENT_END]"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 173,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[TEXISE_CATEGORY] clarity"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 174,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[TEXISE_CONFIDENCE] 0.93"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 175,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[TEXISE_REASON] Clarify the sentence while preserving LaTeX commands."
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 176,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[TEXISE_END]`;"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 186,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "expect(platform.generations[0]?.messages[0]?.content).toContain('Never output [TEXISE_END]');"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 191,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('accepts plain Local AI replacement text and strips leaked TeXise protocol markers', async () => {"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 193,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const response = 'This sentence is clear.\\n[TEXISE_END]';"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 201,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "expect(suggestion?.replacement).not.toContain('TEXISE_END');"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 219,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const bib = '@article{texise2026,\\n  title = {latex and ai for pdf workflows},\\n  author = {Author, A.},\\n  year = {2026}\\n}\\n';"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 1228,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(run.artifacts.reportPath).toMatch(/^\\.texise\\/reviews\\/review-.*\\.md$/u);"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-ai-writing-service.spec.ts",
      "line": 1232,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(markdown).toContain('# TeXise Paper Review');"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-live-draft-service.spec.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "recordArtifactPath: '__texise_live__/layout.jsonl',"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-paper-memory-service.spec.ts",
      "line": 206,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(metadata.texisePaperMemory).toMatchObject({ version: 1 });"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(sourceAfterComment).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 115,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(rejectedSource).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 136,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(sourceWithTrackedReview).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 210,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(stable).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 230,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'% TEXISE-REVIEW-BEGIN v1',"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 231,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "`% TEXISE-REVIEW ${JSON.stringify(thread)}`,"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 232,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'% TEXISE-REVIEW-END',"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 237,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "{ texiseReview: { version: 1, id: projectId } },"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 251,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(services.latexSource.getSnapshot(wsPath)?.text).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 268,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "author: { id: 'texise-ai-test', displayName: 'TeXise AI', kind: 'ai' },"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 288,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "author: { id: 'texise-ai-test', displayName: 'TeXise AI', kind: 'ai' },"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 307,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "sourceAnchor: anchor, author: { id: 'texise-ai-test', displayName: 'TeXise AI', kind: 'ai' },"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 324,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "sourceAnchor: anchor, author: { id: 'texise-ai-test', displayName: 'TeXise AI', kind: 'ai' },"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 343,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "author: { id: 'texise-ai-source', displayName: 'TeXise AI', kind: 'ai' },"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-review-service.spec.ts",
      "line": 378,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "author: { id: 'texise-ai-visual', displayName: 'TeXise AI', kind: 'ai' },"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-storage-service.spec.ts",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "DEFAULT_TEXISE_MAIN_TEX,"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-storage-service.spec.ts",
      "line": 110,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "new TextEncoder().encode(DEFAULT_TEXISE_MAIN_TEX),"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-storage-service.spec.ts",
      "line": 137,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const modifiedSource = new TextEncoder().encode(`${DEFAULT_TEXISE_MAIN_TEX}% user edit\\n`);"
    },
    {
      "path": "packages/core/service-core/src/__tests__/project-storage-service.spec.ts",
      "line": 174,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "new TextEncoder().encode(DEFAULT_TEXISE_MAIN_TEX),"
    },
    {
      "path": "packages/core/service-core/src/__tests__/workspace-ops-service.spec.ts",
      "line": 156,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "metadata: { texiseCollaboration: { source: 'joined' } },"
    },
    {
      "path": "packages/core/service-core/src/ai-structured-output.ts",
      "line": 25,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": ".replace(/\\[TEXISE_[A-Z0-9_]+\\]/gu, '')"
    },
    {
      "path": "packages/core/service-core/src/index.ts",
      "line": 128,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "DEFAULT_TEXISE_GIT_CORS_PROXY,"
    },
    {
      "path": "packages/core/service-core/src/index.ts",
      "line": 129,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_AUTHOR_EMAIL_STORAGE_KEY,"
    },
    {
      "path": "packages/core/service-core/src/index.ts",
      "line": 130,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_AUTHOR_NAME_STORAGE_KEY,"
    },
    {
      "path": "packages/core/service-core/src/index.ts",
      "line": 131,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_CORS_PROXY_STORAGE_KEY,"
    },
    {
      "path": "packages/core/service-core/src/note-snapshot-service.ts",
      "line": 52,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const SNAPSHOT_LOCK_PREFIX = 'texise:note-snapshots:';"
    },
    {
      "path": "packages/core/service-core/src/project-ai-service.ts",
      "line": 54,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const SETTINGS_KEY = 'texise:ai:settings:v1';"
    },
    {
      "path": "packages/core/service-core/src/project-ai-service.ts",
      "line": 55,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const API_KEY_KEY = 'texise:ai:remembered-api-key:v1';"
    },
    {
      "path": "packages/core/service-core/src/project-ai-service.ts",
      "line": 56,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const LAST_CLOUD_PROFILE_KEY = 'texise:ai:last-cloud-profile:v1';"
    },
    {
      "path": "packages/core/service-core/src/project-ai-service.ts",
      "line": 57,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CLOUD_CREDENTIAL_DB = 'texise-ai-credentials-v1';"
    },
    {
      "path": "packages/core/service-core/src/project-ai-service.ts",
      "line": 60,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const HISTORY_PREFIX = 'texise:ai:history:v1:';"
    },
    {
      "path": "packages/core/service-core/src/project-ai-service.ts",
      "line": 1580,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "author: { id: 'texise-ai', displayName: 'Learnitive AI', kind: 'ai' },"
    },
    {
      "path": "packages/core/service-core/src/project-ai-service.ts",
      "line": 1639,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "author: { id: 'texise-ai', displayName: 'Learnitive AI', kind: 'ai' },"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const SETTINGS_KEY = 'texise:ai-writing:settings:v1';"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 27,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const REVIEW_RUN_DB = 'texise-ai-writing-v1';"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 2108,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "author: { id: 'texise-ai-suggest', displayName: input.automatic ? 'Learnitive AI · Automatic' : 'Learnitive AI', kind: 'ai' },"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 2169,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": ".replace(/\\[TEXISE_END\\]/giu, '')"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 2170,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": ".replace(/\\[TEXISE_(?:CATEGORY|CONFIDENCE|REASON)\\][^\\r\\n]*/giu, '')"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 2171,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": ".replace(/\\[TEXISE_REPLACEMENT_(?:BEGIN|END)\\]/giu, '')"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 2176,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const begin = '[TEXISE_REPLACEMENT_BEGIN]';"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 2177,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const end = '[TEXISE_REPLACEMENT_END]';"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 2184,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const field = (name: string): string => new RegExp(`\\\\[TEXISE_${name}\\\\]\\\\s*([^\\\\r\\\\n]*)`, 'iu').exec(raw)?.[1]?.trim() ?? '';"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 2245,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'Never output [TEXISE_END] or any [TEXISE_*] marker.',"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 2346,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "if (/\\[TEXISE_[A-Z_]+\\]/iu.test(replacement)) return false;"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 2895,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return `texise-project:${wsName}:${config.rootFile}`;"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 2932,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".filter((path) => !path.startsWith('.texise/'))"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 3857,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "await provider.createDirectory(projectDirectoryPath('.texise/'), signal).catch(() => undefined);"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 3858,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "await provider.createDirectory(projectDirectoryPath('.texise/reviews/'), signal).catch(() => undefined);"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 3861,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "let path = `.texise/reviews/review-${stamp}.md`;"
    },
    {
      "path": "packages/core/service-core/src/project-ai-writing-service.ts",
      "line": 3863,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "while (await provider.readFile(projectFilePath(path), signal).catch(() => undefined)) path = `.texise/reviews/review-${stamp}-${suffix++}.md`;"
    },
    {
      "path": "packages/core/service-core/src/project-collaboration-service.ts",
      "line": 60,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const COLLAB_USER_ID_KEY = 'texise-collaboration-user-id';"
    },
    {
      "path": "packages/core/service-core/src/project-collaboration-service.ts",
      "line": 61,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const COLLAB_USER_NAME_KEY = 'texise-collaboration-name';"
    },
    {
      "path": "packages/core/service-core/src/project-collaboration-service.ts",
      "line": 62,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const COLLAB_USER_COLOR_KEY = 'texise-collaboration-color';"
    },
    {
      "path": "packages/core/service-core/src/project-collaboration-service.ts",
      "line": 63,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const JOINED_COLLABORATION_METADATA_KEY = 'texiseCollaboration';"
    },
    {
      "path": "packages/core/service-core/src/project-collaboration-service.ts",
      "line": 64,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const RECONNECT_DESCRIPTOR_PREFIX = 'texise-collaboration-descriptor:';"
    },
    {
      "path": "packages/core/service-core/src/project-collaboration-service.ts",
      "line": 65,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const SNAPSHOT_BASELINE_PREFIX = 'texise-collaboration-snapshot:';"
    },
    {
      "path": "packages/core/service-core/src/project-collaboration-service.ts",
      "line": 66,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const RECOVERY_DIRECTORY = '.texise-local-recovery';"
    },
    {
      "path": "packages/core/service-core/src/project-collaboration-service.ts",
      "line": 102,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "headers: { Accept: 'application/json', 'Content-Type': 'application/json', 'x-texise-csrf': auth.csrfToken },"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.spec.ts",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const TOKEN = 'texise1.eyJ2ZXJzaW9uIjoxLCJ0aWVyIjoicHJvIiwic291cmNlIjoicHJlZGVmaW5lZCIsImxpY2Vuc2VGaW5nZXJwcmludCI6InRlc3Q6Zml4dHVyZTowMDAxIiwiaXNzdWVkQXQiOjE4MDAwMDAwMDAsInJlZnJlc2hBZnRlciI6MTgwMjU5MjAwMCwidmFsaWRVbnRpbCI6MTgxMDM2ODAwMCwicmVmcmVzaEhhbmRsZSI6ImZpeHR1cmUifQ.TdwaVh9vhJ-0HBUgzjGkvU1Ce1HUvwc4HWTlW9SkPZHM9PzXSTnUFys096k8NOygcV_VeSPtujj6U97bhTuFAg';"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.spec.ts",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const tampered = TOKEN.replace('texise1.', 'texise1.A');"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.ts",
      "line": 6,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const TOKEN_KEY = 'texise:pro:entitlement:v1';"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.ts",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LEGACY_PUBLIC_KEY_KEY = 'texise:pro:public-key:v1';"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.ts",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const TOKEN_PREFIX = 'texise1';"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.ts",
      "line": 9,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CLOUD_FALLBACK_CLIENT_KEY = 'texise:compile:fallback-client:v1';"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.ts",
      "line": 201,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return typeof __TEXISE_ENTITLEMENT_PUBLIC_KEY__ === 'string'"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.ts",
      "line": 202,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "? __TEXISE_ENTITLEMENT_PUBLIC_KEY__.trim()"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.ts",
      "line": 211,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return typeof __TEXISE_ENTITLEMENT_KEY_ID__ === 'string'"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.ts",
      "line": 212,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "? __TEXISE_ENTITLEMENT_KEY_ID__.trim()"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.ts",
      "line": 394,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "...(authenticated ? { 'x-texise-csrf': account.csrfToken } : {}),"
    },
    {
      "path": "packages/core/service-core/src/project-entitlement-service.ts",
      "line": 497,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "...(accountAuthenticated ? {'x-texise-csrf': account.csrfToken} : {}),"
    },
    {
      "path": "packages/core/service-core/src/project-execution-service.ts",
      "line": 160,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "headers: { accept: 'application/json', 'x-texise-csrf': csrf },"
    },
    {
      "path": "packages/core/service-core/src/project-execution-service.ts",
      "line": 170,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'x-texise-csrf': csrf,"
    },
    {
      "path": "packages/core/service-core/src/project-git-service.ts",
      "line": 194,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(entry) => entry.kind === 'file' && entry.path !== 'texise.json',"
    },
    {
      "path": "packages/core/service-core/src/project-git-service.ts",
      "line": 232,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const existing = metadata.texiseGitRepositoryId;"
    },
    {
      "path": "packages/core/service-core/src/project-git-service.ts",
      "line": 244,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "(current) => ({ ...current, texiseGitRepositoryId: repositoryId }),"
    },
    {
      "path": "packages/core/service-core/src/project-paper-memory-service.ts",
      "line": 85,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const PAPER_MEMORY_METADATA_KEY = 'texisePaperMemory';"
    },
    {
      "path": "packages/core/service-core/src/project-pdf-service.ts",
      "line": 47,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const PDF_VIEW_STATE_STORAGE_PREFIX = 'texise:pdf-view:v1:';"
    },
    {
      "path": "packages/core/service-core/src/project-research-workflow-service.ts",
      "line": 407,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ semanticKind: 'section', author: { id: 'texise-ai', displayName: 'Learnitive AI', kind: 'ai' }, source: 'research' },"
    },
    {
      "path": "packages/core/service-core/src/project-review-service.ts",
      "line": 30,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const REVIEW_DB = 'texise-review-v1';"
    },
    {
      "path": "packages/core/service-core/src/project-review-service.ts",
      "line": 34,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const REVIEW_METADATA_KEY = 'texiseReview';"
    },
    {
      "path": "packages/core/service-core/src/project-review-service.ts",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const REVIEW_AUTHOR_ID_KEY = 'texise:review:author-id';"
    },
    {
      "path": "packages/core/service-core/src/project-review-service.ts",
      "line": 36,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const REVIEW_AUTHOR_NAME_KEY = 'texise:review:author-name';"
    },
    {
      "path": "packages/core/service-core/src/project-review-service.ts",
      "line": 37,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const TRACK_CHANGES_KEY_PREFIX = 'texise:review:track-changes:';"
    },
    {
      "path": "packages/core/service-core/src/project-review-service.ts",
      "line": 38,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const REVIEW_LEDGER_BEGIN = '% TEXISE-REVIEW-BEGIN v1';"
    },
    {
      "path": "packages/core/service-core/src/project-review-service.ts",
      "line": 39,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const REVIEW_LEDGER_ENTRY = '% TEXISE-REVIEW ';"
    },
    {
      "path": "packages/core/service-core/src/project-review-service.ts",
      "line": 40,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const REVIEW_LEDGER_END = '% TEXISE-REVIEW-END';"
    },
    {
      "path": "packages/core/service-core/src/project-review-service.ts",
      "line": 499,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (thread.status === 'outdated') activity.push({ id: `legacy:${thread.id}:outdated`, projectId, kind: 'change-outdated', createdAt: thread.updatedAt, author: { id: 'texise-system', displayName: 'Learnitive', kind: 'system' }, summary: 'Review anchor became outdated', threadId: thread.id, ...(filePath ? { filePath } : {}), source: 'system' });"
    },
    {
      "path": "packages/core/service-core/src/project-review-service.ts",
      "line": 1237,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const author = input.author ?? { id: 'texise-ai-suggest', displayName: 'Learnitive AI', kind: 'ai' as const };"
    },
    {
      "path": "packages/core/service-core/src/project-review-service.ts",
      "line": 1667,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "await this.recordActivity(wsName, { kind: 'change-outdated', author: { id: 'texise-system', displayName: 'Learnitive', kind: 'system' }, summary: thread.change ? 'Tracked change became outdated' : 'Review anchor became outdated', threadId: thread.id, ...(thread.anchor?.filePath ? { filePath: thread.anchor.filePath } : {}), ...(thread.change?.type ? { changeType: thread.change.type } : {}), source: 'system' });"
    },
    {
      "path": "packages/core/service-core/src/project-semantic-service.ts",
      "line": 37,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const MEANING_METADATA_KEY = 'texiseProjectMeaning';"
    },
    {
      "path": "packages/core/service-core/src/project-storage-service.ts",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "DEFAULT_TEXISE_MAIN_TEX,"
    },
    {
      "path": "packages/core/service-core/src/project-storage-service.ts",
      "line": 34,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const defaultMainTexBytes = encoder.encode(DEFAULT_TEXISE_MAIN_TEX);"
    },
    {
      "path": "packages/core/service-core/src/project-terminal-service.ts",
      "line": 92,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const GIT_IDENTITY_METADATA_KEY = 'texiseTerminalGitIdentity';"
    },
    {
      "path": "packages/core/service-core/src/research-artifact-files.ts",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const RESEARCH_ARTIFACTS_METADATA_KEY = 'texiseResearchArtifacts';"
    },
    {
      "path": "packages/core/service-core/src/workspace-ops-service.ts",
      "line": 20,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const JOINED_COLLABORATION_METADATA_KEY = 'texiseCollaboration';"
    },
    {
      "path": "packages/js-lib/baby-fs/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/baby-fs/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/baby-fs/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/bibliography/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Lossless BibTeX/BibLaTeX parsing and targeted edits for TeXise.\","
    },
    {
      "path": "packages/js-lib/bibliography/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/bibliography/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/bibliography/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/browser-utils/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Collection of browser-specific utility functions for TeXise\","
    },
    {
      "path": "packages/js-lib/browser-utils/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/browser-utils/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/browser-utils/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/color-scheme-manager/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/color-scheme-manager/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/color-scheme-manager/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/fuzzysearch/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/fuzzysearch/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/fuzzysearch/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"CodeMirror 6 LaTeX source editor integration for TeXise.\","
    },
    {
      "path": "packages/js-lib/latex-codemirror/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/latex-codemirror/package.json",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/latex-codemirror/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/__tests__/editor-r14-16.spec.ts",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('R14.16 TeXise CodeMirror session', () => {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/__tests__/editor-r14-19.spec.ts",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('R14.19 TeXise editor feature parity', () => {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/__tests__/editor-r14-19.spec.ts",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('detects TeXise Ctrl/Cmd-click navigation targets without moving the caret itself', () => {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/__tests__/syntax-highlighting-r14-28-21.spec.ts",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('TeXise Source syntax highlighting', () => {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/bibtex-language.ts",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* Lightweight BibTeX/BibLaTeX mode for TeXise Source editing."
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 61,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const texiseSourceHighlightStyle = HighlightStyle.define(["
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 62,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.keyword, color: 'var(--texise-syntax-keyword)', fontWeight: '600' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 63,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.tagName, color: 'var(--texise-syntax-command)' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 64,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.escape, color: 'var(--texise-syntax-command)' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 65,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.typeName, color: 'var(--texise-syntax-type)', fontWeight: '600' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 66,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.propertyName, color: 'var(--texise-syntax-property)' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 67,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.variableName, color: 'var(--texise-syntax-name)' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 68,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.string, color: 'var(--texise-syntax-string)' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 69,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.number, color: 'var(--texise-syntax-number)' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 70,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.comment, color: 'var(--texise-syntax-comment)', fontStyle: 'italic' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 71,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.operator, color: 'var(--texise-syntax-operator)' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 72,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.bracket, color: 'var(--texise-syntax-punctuation)' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 73,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ tag: tags.punctuation, color: 'var(--texise-syntax-punctuation)' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 355,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "syntaxHighlighting(texiseSourceHighlightStyle),"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/editor.ts",
      "line": 721,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "syntaxHighlighting(texiseSourceHighlightStyle),"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/mathlive.ts",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* TeXise CodeMirror MathLive lifecycle. It detects math from the"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/mathlive.ts",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* editing to TeXise's shared revision-guarded MathLive editor. The extension"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/mathlive.ts",
      "line": 142,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "overlay.className = 'texise-cm-math-preview fixed z-[85] flex max-w-[min(600px,calc(100vw-32px))] items-center gap-2 rounded-lg border bg-background p-2 shadow-xl';"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/mathlive.ts",
      "line": 143,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "overlay.dataset.testid = 'texise-mathlive-preview';"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 215,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const searchHighlight = Decoration.mark({ class: 'cm-texise-search-highlight' });"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 254,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.cm-texise-search-highlight': {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 299,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button.className = `cm-texise-review-point cm-texise-review-${this.item.status}${this.item.kind === 'change' ? ` cm-texise-change-${this.item.changeType ?? 'replace'}` : ''}${this.item.conflicted ? ' cm-texise-review-conflicted' : ''}${this.item.automatic ? ' cm-texise-ai-ghost' : ''}`;"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 301,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (this.item.authorColor) button.style.setProperty('--texise-review-color', this.item.authorColor);"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 324,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "class: `cm-texise-review-anchor cm-texise-review-${item.status}${item.kind === 'change' ? ` cm-texise-change-${item.changeType ?? 'replace'}` : ''}${item.conflicted ? ' cm-texise-review-conflicted' : ''}${item.automatic ? ' cm-texise-ai-ghost' : ''}`,"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 329,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "...(item.authorColor ? { style: `--texise-review-color:${item.authorColor}` } : {}),"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.cm-texise-review-anchor': {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 355,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "borderBottom: '2px solid color-mix(in srgb, var(--texise-review-color, var(--primary)) 72%, transparent)',"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 356,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "backgroundColor: 'color-mix(in srgb, var(--texise-review-color, var(--primary)) 9%, transparent)',"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 360,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.cm-texise-review-resolved': { opacity: '0.55' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 361,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.cm-texise-change-insert': { borderBottomColor: 'color-mix(in srgb, var(--texise-review-color, #15803d) 78%, transparent)', backgroundColor: 'color-mix(in srgb, var(--texise-review-color, #22c55e) 14%, transparent)' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 362,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.cm-texise-change-replace': { borderBottomColor: 'color-mix(in srgb, var(--texise-review-color, #b45309) 78%, transparent)', backgroundColor: 'color-mix(in srgb, var(--texise-review-color, #f59e0b) 14%, transparent)' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 363,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.cm-texise-change-delete': { color: 'var(--destructive)', fontWeight: '700' },"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 364,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.cm-texise-ai-ghost': {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 370,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.cm-texise-review-outdated': {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 374,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.cm-texise-review-conflicted': {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 380,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.cm-texise-review-point': {"
    },
    {
      "path": "packages/js-lib/latex-codemirror/src/project-features.ts",
      "line": 381,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: '0', background: 'transparent', color: 'var(--texise-review-color, var(--primary))', padding: '0 2px', cursor: 'pointer', fontSize: '9px', verticalAlign: 'middle'"
    },
    {
      "path": "packages/js-lib/latex-compiler/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Browser-agnostic LaTeX compiler contracts, project collection, bibliography policy, and log diagnostics for TeXise.\","
    },
    {
      "path": "packages/js-lib/latex-compiler/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/latex-compiler/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/latex-compiler/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/latex-compiler/src/diagnostics.ts",
      "line": 147,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "'This project requires makeindex. Install the primary browser compiler assets to build indexes in TeXise.',"
    },
    {
      "path": "packages/js-lib/latex-compiler/src/project-files.ts",
      "line": 7,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const INTERNAL_PREFIXES = ['.git/', '.texise-generated/cache/'] as const;"
    },
    {
      "path": "packages/js-lib/latex-compiler/src/project-files.ts",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* load data using extensions TeXise does not otherwise understand."
    },
    {
      "path": "packages/js-lib/latex-mathlive/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"MathLive browser integration for source-backed TeXise equations.\","
    },
    {
      "path": "packages/js-lib/latex-mathlive/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/latex-mathlive/package.json",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/latex-mathlive/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/latex-mathlive/src/index.ts",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Use the TeXise MathLive split: read-only preview widgets hide the"
    },
    {
      "path": "packages/js-lib/latex-mathlive/src/index.ts",
      "line": 89,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "/** Searchable LaTeX symbol catalogue used by the TeXise math editor. */"
    },
    {
      "path": "packages/js-lib/latex-source/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Lossless source-edit helpers and context-aware LaTeX insertion policies for TeXise.\","
    },
    {
      "path": "packages/js-lib/latex-source/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/latex-source/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/latex-source/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/latex-source/src/line-endings.ts",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Most TeXise projects use LF. Avoid a JavaScript character-by-character"
    },
    {
      "path": "packages/js-lib/latex-source/src/line-endings.ts",
      "line": 43,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* CodeMirror's Text model uses LF positions. TeXise's canonical source may"
    },
    {
      "path": "packages/js-lib/latex-source/src/math.test.ts",
      "line": 96,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('R14.18 detects TeXise LaTeX delimiters and matrix-family environments', () => {"
    },
    {
      "path": "packages/js-lib/latex-source/src/math.ts",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* Shared TeXise LaTeX math region model."
    },
    {
      "path": "packages/js-lib/latex-source/src/math.ts",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* this module. The shape is shared across TeXise Source and Visual editing so the"
    },
    {
      "path": "packages/js-lib/latex-source/src/math.ts",
      "line": 73,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// TeXise can edit these through MathLive and keeps the safety filter for"
    },
    {
      "path": "packages/js-lib/latex-source/src/structural-break.ts",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* Canonical hard-break spelling used by every TeXise Visual insertion path."
    },
    {
      "path": "packages/js-lib/latex-source/src/table.ts",
      "line": 95,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// TeXise-created tables use a visible full grid by default. Existing user"
    },
    {
      "path": "packages/js-lib/latex-source/src/table.ts",
      "line": 437,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Only opt into TeXise-style grid maintenance when each boundary contains"
    },
    {
      "path": "packages/js-lib/latex-source/src/table.ts",
      "line": 451,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* rules remain source-preserved. TeXise-created full-grid `\\hline` tables are"
    },
    {
      "path": "packages/js-lib/latex-synctex/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"SyncTeX parsing and source-to-PDF mapping primitives for TeXise.\","
    },
    {
      "path": "packages/js-lib/latex-synctex/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/latex-synctex/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/latex-synctex/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/latex-synctex/src/synctex-parser.ts",
      "line": 161,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* public TeXise mapping contract in TeX points. Raw node coordinates are"
    },
    {
      "path": "packages/js-lib/latex-visual/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Lossless ProseMirror projection for TeXise LaTeX visual editing.\","
    },
    {
      "path": "packages/js-lib/latex-visual/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/latex-visual/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/latex-visual/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 70,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('BF4 TeXise-native LaTeX Visual editor', () => {"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('uses the native TeXise engine when source is supplied', () => {"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.classList.contains('texise-latex-visual-editor')).toBe(true);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 75,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.dataset.texiseNativeVisual).toBe('true');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 80,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const block = editor.view.dom.querySelector<HTMLElement>('.texise-visual-raw-block');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 83,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelector('.texise-visual-raw-inline')).toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 88,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const blocks = [...editor.view.dom.querySelectorAll<HTMLElement>('.texise-visual-raw-block')];"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 97,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const emptyParagraphs = [...editor.view.dom.querySelectorAll<HTMLElement>('.texise-visual-paragraph')].filter("
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 110,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const environment = editor.view.dom.querySelector<HTMLElement>('[data-texise-latex-text-environment]');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 114,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(environment?.querySelectorAll('[data-texise-latex-raw-inline]')).toHaveLength(0);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 164,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelector('[data-texise-latex-raw-block]')).not.toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 209,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelector('[data-texise-source-trivia]')).toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 210,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const setup = editor.view.dom.querySelector<HTMLElement>('.texise-visual-document-setup');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 232,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelector('[data-texise-source-trivia]')).toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 268,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelector('.texise-visual-document-setup')).not.toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 272,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const setup = editor.view.dom.querySelector<HTMLElement>('.texise-visual-document-setup');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 316,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const setup = editor.view.dom.querySelector<HTMLElement>('.texise-visual-document-setup');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 318,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(setup?.querySelector('.texise-visual-protected-source')?.textContent).toBe(preamble);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 324,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(figure?.querySelector('.texise-visual-protected-source')?.textContent).toBe(rawFigure);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 328,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(figure?.querySelector('.texise-visual-protected-source')?.textContent.length).toBeGreaterThan(0);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 356,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(figure?.querySelector('.texise-visual-protected-source')?.textContent).toContain('\\\\begin{figure}[htb]');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 383,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelector('[data-texise-latex-raw-block]')).toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 402,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(secondSession.editor.view.dom.querySelector('[data-texise-latex-raw-block]')).toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 403,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(secondSession.editor.view.dom.querySelector('[data-texise-latex-raw-inline]')).toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 408,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(thirdSession.editor.view.dom.querySelector('[data-texise-latex-raw-block]')).toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 409,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(thirdSession.editor.view.dom.querySelector('[data-texise-latex-raw-inline]')).toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 433,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(secondSession.editor.view.dom.querySelector('[data-texise-latex-raw-block]')).toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 440,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraphs = [...editor.view.dom.querySelectorAll<HTMLElement>('.texise-visual-paragraph')]"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 445,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const blocks = [...editor.view.dom.querySelectorAll<HTMLElement>('[data-texise-latex-raw-block]')];"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 447,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(blocks[0]?.querySelector('.texise-visual-protected-source')?.textContent).toBe(unsupported);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 456,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelectorAll('.texise-visual-math-display')).toHaveLength(1);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 457,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelector('.texise-visual-math-display')?.textContent).toContain('E=mc^2');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 458,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelector('.texise-visual-raw-block')?.textContent ?? '').not.toContain('\\\\begin{equation}');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 470,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(block?.querySelector('.texise-visual-protected-source')?.textContent).toBe(tikz);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 471,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(block?.querySelector('.texise-visual-protected-source')?.textContent.length).toBeGreaterThan(0);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 554,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('uses native TeXise Tab indentation and serializes nested list siblings as one LaTeX environment', () => {"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 608,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('assigns unique native source ids after a TeXise paragraph split', () => {"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 664,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const equationDom = editor.view.dom.querySelector<HTMLElement>('.texise-visual-math-display');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 665,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(equationDom?.classList.contains('texise-visual-math-protected')).toBe(true);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 678,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const equationDom = editor.view.dom.querySelector<HTMLElement>('.texise-visual-math-display');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 721,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(deletion?.classList.contains('texise-visual-change-deletion-widget')).toBe(true);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 729,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelector('[data-texise-latex-raw-block]')).not.toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 762,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelector('[data-texise-latex-raw-block]')).not.toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 770,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(editor.view.dom.querySelector('[data-texise-latex-raw-block]')).not.toBeNull();"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 808,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('resizes the LaTeX column specification after native TeXise column deletion and insertion', () => {"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 881,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const columnLabels = [...document.querySelectorAll<HTMLElement>('.texise-visual-table-menu-label')];"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 961,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('BF4.3 Visual stability and TeXise parity', () => {"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 976,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('never synthesizes TeXise review metadata into Visual-serialized LaTeX', () => {"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 984,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(native.currentSource()).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 1028,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const trigger = document.querySelector<HTMLElement>('.texise-visual-table-actions-summary');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts",
      "line": 1239,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('inserts a TeXise table at the slash paragraph and centers it by default', () => {"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-r14-18.spec.ts",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('turns native typed slash into the same suggestion mark used by the TeXise left + path', () => {"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-r14-18.spec.ts",
      "line": 771,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "editor.updateAssetUrls(new Map([[figure.id, 'blob:texise-phase1-preview']]));"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-r14-18.spec.ts",
      "line": 777,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'blob:texise-phase1-preview',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/__tests__/visual-r14-18.spec.ts",
      "line": 1061,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const math = host.querySelector<HTMLElement>('.texise-visual-math-display');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 30,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "import { createNativeTexiseLatexVisualEditor } from './native-texise-editor';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 195,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return [`h${level}`, { class: 'texise-visual-heading', 'data-source-id': node.attrs.id }, 0];"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 210,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "? 'texise-visual-paragraph texise-visual-synthetic-paragraph'"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 211,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ": 'texise-visual-paragraph',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 224,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return ['p', { class: 'texise-visual-paragraph texise-visual-rich-paragraph', 'data-source-id': node.attrs.id }, 0];"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 250,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "? `texise-visual-inline texise-visual-inline-${visualKind} texise-visual-synthetic-inline`"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 251,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ": `texise-visual-inline texise-visual-inline-${visualKind}`,"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 280,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "class: 'texise-visual-hard-break',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 309,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "? 'texise-visual-math texise-visual-math-display'"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 310,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ": 'texise-visual-math texise-visual-math-inline',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 324,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// a valid default item. Parsed TeXise lists still always provide their"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 340,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "class: 'texise-visual-list-wrap',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 345,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ class: 'texise-visual-list-toolbar', contenteditable: 'false' },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 348,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ class: 'texise-visual-list-actions' },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 349,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['summary', { class: 'texise-visual-list-actions-summary', title: 'List actions', 'aria-label': 'List actions' }, '⋮'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 352,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ class: 'texise-visual-list-actions-menu' },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['button', { type: 'button', 'data-visual-list-command': 'delete-list', class: 'texise-visual-list-destructive' }, 'Delete list'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 361,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "class: 'texise-visual-list',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 373,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return ['li', { class: 'texise-visual-list-item', 'data-source-id': String(node.attrs.id) }, 0];"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 387,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "? ['img', { src: url, alt: String(node.attrs.caption || asset), class: 'texise-visual-figure-image' }]"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 388,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ": ['div', { class: 'texise-visual-figure-placeholder' }, asset || 'Figure'];"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 392,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "class: 'texise-visual-figure',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 401,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "...(node.attrs.label ? [['div', { class: 'texise-visual-meta' }, `#${String(node.attrs.label)}`]] : []),"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 413,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ class: 'texise-visual-table-wrap', 'data-source-id': node.attrs.id },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 416,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ class: 'texise-visual-table-toolbar', contenteditable: 'false' },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 417,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['button', { type: 'button', class: 'texise-visual-table-meta-button', 'data-visual-action': 'table' }, String(node.attrs.caption || 'Table')],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 421,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ class: 'texise-visual-table-actions' },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 422,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['summary', { class: 'texise-visual-table-actions-summary', title: 'Table actions', 'aria-label': 'Table actions' }, '⋮'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 425,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ class: 'texise-visual-table-actions-menu' },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 433,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['button', { type: 'button', 'data-visual-table-command': 'delete-table', class: 'texise-visual-table-destructive' }, 'Delete table'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 438,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['table', { class: 'texise-visual-table' }, ['tbody', {}, 0]],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 439,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "...(node.attrs.label ? [['div', { class: 'texise-visual-meta', contenteditable: 'false' }, `#${String(node.attrs.label)}`]] : []),"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 447,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// a valid default cell. Parsed TeXise tables still always provide their"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 477,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ class: 'texise-visual-theorem', 'data-source-id': node.attrs.id, ...(node.attrs.editable ? {} : { contenteditable: 'false' }) },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 478,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['div', { class: 'texise-visual-theorem-title', contenteditable: 'false' }, String(node.attrs.title || node.attrs.environment)],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 479,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['div', { class: 'texise-visual-theorem-body' }, 0],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 491,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ class: 'texise-visual-raw', contenteditable: 'false', 'data-source-id': node.attrs.id },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 492,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['div', { class: 'texise-visual-raw-label' }, 'Raw LaTeX'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 509,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "if (!type) throw new Error(`Missing TeXise visual schema node: ${name}`);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1046,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Match TeXise's block-handle behavior: when the pointer is in the left"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1454,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "toolbar.className = 'texise-visual-selection-toolbar hidden';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1469,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button.className = 'texise-visual-selection-button';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1479,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "aiButton.className = 'texise-visual-selection-button texise-ai-selection-button';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1490,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const VISUAL_INTERNAL_ASSET_REFRESH = 'texiseVisualInternalAssetRefresh';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1553,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-math',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1554,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "display ? 'texise-visual-math-display' : 'texise-visual-math-inline',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1556,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "? 'texise-visual-math-editable'"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1557,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ": 'texise-visual-math-protected',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1579,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "? 'texise-visual-math-field texise-visual-math-field-display'"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1580,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ": 'texise-visual-math-field texise-visual-math-field-inline',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1591,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "fallback.className = 'texise-visual-math-fallback';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 1617,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// R14.18: TeXise's suggestion plugin can miss the native `/` text-input"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2057,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "class: 'texise-latex-visual-editor',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2079,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// R14.11: reuse the original TeXise block-handle builder so Visual mode has"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2087,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "handle.wrapper.classList.add('texise-visual-block-handle', 'hidden');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2300,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "for (const item of view.dom.querySelectorAll('.texise-visual-drop-target')) {"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2302,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-drop-target',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2303,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-drop-before',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2304,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-drop-after',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2325,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-drop-target',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2326,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "placement === 'before' ? 'texise-visual-drop-before' : 'texise-visual-drop-after',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2365,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "draggedBlock.classList.add('texise-visual-dragging');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2368,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "draggedBlock?.classList.remove('texise-visual-dragging');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2396,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// TeXise-style auto-scroll/drop indicator."
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2425,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "drag.source.classList.add('texise-visual-dragging');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2445,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "drag.source.classList.remove('texise-visual-dragging');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2521,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const listElement = listCommandTarget.closest<HTMLElement>('.texise-visual-list-wrap');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2610,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "element?.classList.add('texise-visual-source-reveal');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2611,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "window.setTimeout(() => element?.classList.remove('texise-visual-source-reveal'), 900);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2860,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Typed '/' is owned exclusively by TeXise's suggestion plugin. The left"
    },
    {
      "path": "packages/js-lib/latex-visual/src/index.ts",
      "line": 2867,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "? event.target.closest<HTMLElement>('.texise-visual-figure,[data-visual-math=\"true\"]')"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_NATIVE_LATEX_VISUAL = true;"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 64,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const VISUAL_ASSET_ERROR_PREFIX = 'texise-asset-error:';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 93,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "parseDOM: [{ tag: 'div[data-texise-latex-raw-block]' }],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 112,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "class: 'texise-visual-source-trivia',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 113,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'data-texise-source-trivia': 'true',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 132,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-raw-block',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 133,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-protected-clickable',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 134,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualKind === 'figure' ? 'texise-visual-figure' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 135,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualKind === 'theorem' ? 'texise-visual-theorem' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 136,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualKind === 'heading' ? 'texise-visual-heading texise-visual-raw-heading' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 137,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualKind === 'table' ? 'texise-visual-protected-table' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 138,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualKind === 'preamble' ? 'texise-visual-document-setup' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 140,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'data-texise-latex-raw-block': 'true',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 170,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['div', { class: 'texise-visual-protected-header' },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 172,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['span', { class: 'texise-visual-protected-action', 'aria-hidden': 'true' }, 'Open in Source →'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 175,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "? ['div', { class: 'texise-visual-figure-preview-grid' },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 192,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "class: 'texise-visual-figure-image',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 197,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ class: 'texise-visual-figure-placeholder texise-visual-figure-asset-placeholder', 'data-preview-status': status },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 202,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ": ['div', { class: 'texise-visual-figure-placeholder' }, 'Figure source preserved · preview unavailable'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 203,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "...(caption ? [['div', { class: 'texise-visual-protected-caption' }, caption]] : []),"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 204,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "...(summary ? [['div', { class: 'texise-visual-protected-summary' }, summary]] : []),"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 205,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "...(labelText ? [['div', { class: 'texise-visual-meta' }, `Label: ${labelText}`]] : []),"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 206,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['div', { class: 'texise-visual-protected-source-label' }, 'Complete LaTeX'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 207,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['pre', { class: 'texise-visual-protected-source texise-visual-protected-figure-source' }, preview || String(node.attrs.latex ?? '') || 'Protected figure source is unavailable.'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 208,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['div', { class: 'texise-visual-protected-footer' }, 'Protected · Source-only'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 215,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['div', { class: 'texise-visual-protected-header' },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 217,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['span', { class: 'texise-visual-protected-action', 'aria-hidden': 'true' }, 'Open in Source →'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 219,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "...(summary ? [['div', { class: 'texise-visual-protected-summary' }, summary]] : []),"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 220,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['pre', { class: 'texise-visual-protected-source' }, preview || String(node.attrs.latex ?? '') || 'Protected LaTeX source is unavailable.'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 221,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['div', { class: 'texise-visual-protected-footer' }, node.attrs.immutable ? 'Protected · Source-only' : 'Preserved exactly'],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 234,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "parseDOM: [{ tag: 'section[data-texise-latex-text-environment]' }],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 240,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "class: 'texise-visual-text-environment',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 241,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'data-texise-latex-text-environment': 'true',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 246,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "{ class: 'texise-visual-text-environment-header', contenteditable: 'false' },"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 249,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['div', { class: 'texise-visual-text-environment-body' }, 0],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 271,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "parseDOM: [{ tag: 'span[data-texise-latex-raw-inline]' }],"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 279,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "class: 'texise-visual-source-trivia-inline',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 280,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'data-texise-latex-raw-inline': 'true',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 294,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-raw-inline',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 295,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-inline',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 296,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise-visual-inline-${visualKind}`,"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 298,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'data-texise-latex-raw-inline': 'true',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 376,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const nativeReviewDecorationKey = new PluginKey<DecorationSet>('texise-native-review-decorations');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 398,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "decoration.kind === 'comment' ? 'texise-visual-comment-anchor' : 'texise-visual-change-anchor',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 399,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "decoration.kind === 'change' ? `texise-visual-change-${decoration.changeType ?? 'replace'}` : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 400,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "decoration.status === 'resolved' ? 'texise-visual-comment-resolved' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 401,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "decoration.status === 'outdated' ? 'texise-visual-comment-outdated' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 430,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const withIdentity = withVisualNodeIdentity(extension, 'table', 'texise-visual-table', 'latexId');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 523,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-inline',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 524,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise-visual-inline-${markName === 'code' ? 'monospace' : markName}`,"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 541,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// BF4 extends that valid ProseMirror NodeSpec with a TeXise-only attribute,"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 558,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return withVisualNodeIdentity(extension, 'hard_break', 'texise-visual-hard-break');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 607,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return withVisualNodeIdentity(setupParagraph(), 'paragraph', 'texise-visual-paragraph');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 611,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const extension = withVisualNodeIdentity(setupHeading(), 'heading', 'texise-visual-heading');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 630,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const extension = withVisualNodeIdentity(setupList(), 'list', 'texise-visual-list-item');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 666,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// TeXise's list implementation is intentionally flat: each list"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 670,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// when a newly-created TeXise item starts with the schema default"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 773,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// are the exact literal encodings emitted by TeXise's own Visual serializer."
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 1283,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// BF4 edits only table syntax that can round-trip through TeXise's simple"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 1292,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// native TeXise column insertion/deletion, so keep those tables Source-only."
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2540,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "dom.className = `${className} texise-visual-change-deletion-widget${structuralKind ? ' texise-visual-change-deletion-widget-block texise-visual-change-deletion-protected' : ''}`;"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2545,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "header.className = 'texise-visual-protected-header';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2548,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "preview.className = 'texise-visual-protected-source';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2652,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// TeXise-style contextual table control. Keep the manuscript quiet: one"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2657,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "tableToolbar.className = 'texise-visual-native-table-toolbar';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2661,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "tableActions.className = 'texise-visual-table-actions';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2663,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "tableActionsSummary.className = 'texise-visual-table-actions-summary';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2690,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "tableActionsMenu.className = 'texise-visual-table-actions-menu';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2835,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "item.className = 'texise-visual-table-menu-label';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2848,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (options_.destructive) button.classList.add('texise-visual-table-destructive');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2932,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Preserve TeXise's list action affordance, but perform deletion directly"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2934,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// remains entirely TeXise-owned."
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2936,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "listToolbar.className = 'texise-visual-list-toolbar texise-visual-native-list-toolbar';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2941,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "listActions.className = 'texise-visual-list-actions';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2943,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "listActionsSummary.className = 'texise-visual-list-actions-summary';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 2948,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "listActionsMenu.className = 'texise-visual-list-actions-menu';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3019,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (label === 'Delete list') button.className = 'texise-visual-list-destructive';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3138,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "anchor.dataset.texiseMathRequested = 'true';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3169,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-raw-block',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3170,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise-visual-protected-clickable',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3171,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualKind === 'figure' ? 'texise-visual-figure' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3172,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualKind === 'theorem' ? 'texise-visual-theorem' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3173,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualKind === 'heading' ? 'texise-visual-heading texise-visual-raw-heading' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3174,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualKind === 'table' ? 'texise-visual-protected-table' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3175,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualKind === 'preamble' ? 'texise-visual-document-setup' : '',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3177,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "dom.dataset.texiseLatexRawBlock = 'true';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3189,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "header.className = 'texise-visual-protected-header';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3195,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "action.className = 'texise-visual-protected-action';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3203,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "summaryElement.className = 'texise-visual-protected-summary';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3212,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "sourceLabel.className = 'texise-visual-protected-source-label';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3215,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "source.className = 'texise-visual-protected-source texise-visual-protected-figure-source';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3223,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "grid.className = 'texise-visual-figure-preview-grid';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3231,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "image.className = 'texise-visual-figure-image';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3236,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "placeholder.className = 'texise-visual-figure-placeholder texise-visual-figure-asset-placeholder';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3251,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "placeholder.className = 'texise-visual-figure-placeholder';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3257,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "captionElement.className = 'texise-visual-protected-caption';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3263,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "meta.className = 'texise-visual-meta';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3271,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "source.className = 'texise-visual-protected-source';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3279,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "footer.className = 'texise-visual-protected-footer';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3304,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "dom.className = 'texise-visual-math texise-visual-math-inline texise-visual-math-protected texise-visual-math-editable';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3316,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className: 'texise-visual-math-field texise-visual-math-field-inline',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3348,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "dom.className = 'texise-visual-math texise-visual-math-display texise-visual-math-protected';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3352,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "header.className = 'texise-visual-protected-header texise-visual-math-header';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3357,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "editButton.className = 'texise-visual-protected-action';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3361,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "fieldHost.className = 'texise-visual-math-field-host';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3372,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className: 'texise-visual-math-field texise-visual-math-field-display',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3414,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "class: 'texise-latex-visual-editor',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3417,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'data-texise-native-visual': 'true',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3551,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Native TeXise selection formatting. Formatting changes are PM mark"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3552,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// transactions; only the Link button delegates to TeXise's URL dialog."
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3554,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "selectionToolbar.className = 'texise-visual-selection-toolbar hidden';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3599,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button.className = 'texise-visual-selection-button';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3609,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "aiSuggestButton.className = 'texise-visual-selection-button texise-ai-selection-button';"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3670,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Reuse TeXise's block-handle presentation, but move native PM nodes rather"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3671,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// than editing LaTeX ranges. The + button opens TeXise's existing LaTeX"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3678,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "blockHandle.wrapper.classList.add('texise-visual-block-handle', 'hidden');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3682,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.texise-visual-heading',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3683,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.texise-visual-paragraph',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3684,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.texise-visual-list-item',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3685,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.texise-visual-table',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3686,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.texise-visual-math-display',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3687,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.texise-visual-raw-block',"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3721,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "target.closest<HTMLElement>('.texise-visual-list-item, .texise-visual-table') ??"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3726,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Keep the TeXise gutter affordance stable while the pointer travels from a"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3815,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Use ProseMirror's native drag contract, matching TeXise's block handle:"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3818,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// place a TeXise sentinel in text/plain — if a browser/default drop path"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3835,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "draggedBlock.classList.add('texise-visual-dragging');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3838,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "draggedBlock?.classList.remove('texise-visual-dragging');"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 3956,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": ".setMeta('texiseCollaborationProjection', true);"
    },
    {
      "path": "packages/js-lib/latex-visual/src/native-texise-editor.ts",
      "line": 4256,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "if (dom instanceof HTMLElement) dom.dataset.texiseMathRequested = 'true';"
    },
    {
      "path": "packages/js-lib/logger/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/logger/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/logger/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/markdown-syntax/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/markdown-syntax/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/markdown-syntax/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/markdown-syntax/src/__tests__/wiki-link-syntax.spec.ts",
      "line": 100,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(collectWikiLinks('before[[texise.com]]after')).toEqual(["
    },
    {
      "path": "packages/js-lib/markdown-syntax/src/__tests__/wiki-link-syntax.spec.ts",
      "line": 101,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "{ target: 'texise.com', label: null },"
    },
    {
      "path": "packages/js-lib/markdown-syntax/src/list-syntax.ts",
      "line": 9,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const LIST_KIND_ATTR = 'data-texise-list-kind';"
    },
    {
      "path": "packages/js-lib/markdown-syntax/src/list-syntax.ts",
      "line": 12,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const LIST_TIGHT_ATTR = 'data-texise-list-tight';"
    },
    {
      "path": "packages/js-lib/markdown-syntax/src/list-syntax.ts",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const TASK_CHECKED_ATTR = 'data-texise-task-checked';"
    },
    {
      "path": "packages/js-lib/markdown-syntax/src/list-syntax.ts",
      "line": 215,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "md.core.ruler.after('inline', 'texise-list-syntax', (state) => {"
    },
    {
      "path": "packages/js-lib/markdown-syntax/src/table-syntax.ts",
      "line": 27,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "md.core.ruler.before('text_join', 'texise-table-cell-br', (state) => {"
    },
    {
      "path": "packages/js-lib/mini-js-utils/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/mini-js-utils/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/mini-js-utils/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/native-fs/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/native-fs/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/native-fs/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/native-fs/src/__tests__/picker-and-permissions.spec.ts",
      "line": 102,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const handle = await pickDirectory({ id: 'texise-ws' });"
    },
    {
      "path": "packages/js-lib/native-fs/src/__tests__/picker-and-permissions.spec.ts",
      "line": 104,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(picker).toHaveBeenCalledWith({ id: 'texise-ws' });"
    },
    {
      "path": "packages/js-lib/native-fs/src/__tests__/picker-and-permissions.spec.ts",
      "line": 118,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await pickDirectory({ id: 'texise-ws' });"
    },
    {
      "path": "packages/js-lib/native-fs/src/__tests__/picker-and-permissions.spec.ts",
      "line": 191,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "id: 'texise-locate-workspace',"
    },
    {
      "path": "packages/js-lib/native-fs/src/picker.ts",
      "line": 90,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "id: 'texise-locate-workspace',"
    },
    {
      "path": "packages/js-lib/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texiseWorkspaceConfig\": {"
    },
    {
      "path": "packages/js-lib/paper-memory/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Browser-local Paper Memory domain contracts, scientific PDF structure and chunking for TeXise.\","
    },
    {
      "path": "packages/js-lib/paper-memory/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/paper-memory/package.json",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/paper-memory/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": { \"env\": \"universal\", \"kind\": \"library\" },"
    },
    {
      "path": "packages/js-lib/paper-memory/src/rag.ts",
      "line": 257,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// from the model prompt. Gemma cites [S#]; TeXise renders the real page."
    },
    {
      "path": "packages/js-lib/paper-memory/src/rag.ts",
      "line": 283,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export const PAPER_MEMORY_RAG_SYSTEM_PROMPT = `You are TeXise Paper Memory, a browser-local research-paper assistant."
    },
    {
      "path": "packages/js-lib/paper-memory/src/rag.ts",
      "line": 288,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "3. Never invent source IDs, paper metadata or bibliographic fields. Do not state PDF page numbers in the answer; cite [S#] only and TeXise will render the real page from application metadata."
    },
    {
      "path": "packages/js-lib/poor-mans-di/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/poor-mans-di/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/poor-mans-di/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/project-ai/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/project-ai/src/index.ts",
      "line": 808,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": ".replace(/\\[TEXISE_[A-Z0-9_]+\\]/gu, '')"
    },
    {
      "path": "packages/js-lib/project-assets/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Binary-safe image asset import and naming for TeXise projects.\","
    },
    {
      "path": "packages/js-lib/project-assets/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/project-assets/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/project-assets/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/project-collaboration/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Browser-first Yjs/WebSocket collaboration primitives for TeXise projects.\","
    },
    {
      "path": "packages/js-lib/project-collaboration/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/project-collaboration/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/project-collaboration/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/codemirror-yjs-binding.ts",
      "line": 3,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "* (AGPL-3.0-or-later). TeXise keeps its own project/session lifecycle while"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-capabilities.ts",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export const COLLABORATION_REVIEW_TRANSACTION_META_KEY = 'texiseReviewMutation';"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-capabilities.ts",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export const COLLABORATION_REVIEW_UNDO_IDS_META_KEY = 'texiseReviewChangeIds';"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-capabilities.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export const COLLABORATION_REVIEW_UNDO_SNAPSHOT_META_KEY = 'texiseReviewUndoSnapshot';"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 100,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "}, 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 102,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc.transact(() => text.insert(text.toString().indexOf(' X.'), char), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 122,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "}, 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 136,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "}, 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 156,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "author: { id: 'texise-ai-suggest', displayName: 'TeXise AI' },"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 199,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "author: { id: 'texise-ai-suggest', displayName: 'TeXise AI' },"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 219,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "author: { id: 'texise-ai-suggest', displayName: 'TeXise AI' },"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 238,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc.transact(() => text.delete(end - index - 1, 1), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 259,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "a.doc.transact(() => a.text.insert(a.text.length, ' host'), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 275,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc.transact(() => text.delete(from, 'very '.length), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 294,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "undo.trackedOrigins.add('texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 296,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc.transact(() => text.insert(text.length, ' tracked'), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 320,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc.transact(() => text.insert(text.length, ' one'), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 323,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc.transact(() => text.insert(text.length, ' two'), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 353,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "}, 'texise-collaboration-edit:ai');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 364,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc.transact(() => text.insert(text.length, ' a'), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 365,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc.transact(() => text.insert(text.length, 'b'), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 377,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc.transact(() => text.delete(from, 'very '.length), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 387,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc.transact(() => text.delete(secondFrom, 'very '.length), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.test.ts",
      "line": 412,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc.transact(() => text.insert(index * 2, 'a'), 'texise-collaboration-edit');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.ts",
      "line": 10,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const COLLABORATION_REVIEW_MAINTENANCE_ORIGIN = 'texise-collaboration-review-maintenance';"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.ts",
      "line": 329,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (typeof origin === 'string' && origin.startsWith('texise-collaboration-edit:')) {"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.ts",
      "line": 330,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const source = origin.slice('texise-collaboration-edit:'.length);"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/collaboration-review.ts",
      "line": 334,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const source = (origin as { texiseReviewSource?: unknown }).texiseReviewSource;"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.test.ts",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const url = new URL(buildCollaborationJoinUrl(room, 'https://www.texise.com'));"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.ts",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "} from './texise-websocket-provider';"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.ts",
      "line": 63,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export { COLLABORATION_PROTOCOL_VERSION, deriveCollaborationRoomKey } from './texise-websocket-provider';"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.ts",
      "line": 70,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const PERSISTENCE_NAMESPACE = 'texise-collaboration-v7';"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.ts",
      "line": 72,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const COLLABORATION_TEXT_ORIGIN = 'texise-collaboration-edit';"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.ts",
      "line": 138,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const PERSISTENCE_REGISTRY_KEY = 'texise-collaboration-persistence-registry';"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.ts",
      "line": 233,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "}, 'texise-host-session');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.ts",
      "line": 268,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "this.awareness.setLocalStateField('texiseSession', {"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.ts",
      "line": 296,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const identity = state.texiseSession as { protocolVersion?: number; reviewSchemaVersion?: number; capabilities?: unknown; role?: string; roomId?: string; hostSessionId?: string } | undefined;"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.ts",
      "line": 339,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "}, 'texise-session-stop');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.ts",
      "line": 408,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "}, 'texise-project-ready');"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/index.ts",
      "line": 574,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "async persistNow(): Promise<void> { await this.persistence.set('texiseLastFlushAt', Date.now()); }"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/texise-websocket-provider.ts",
      "line": 22,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise-collaboration-v${COLLABORATION_PROTOCOL_VERSION}:${roomId}:${secret}`,"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/texise-websocket-provider.ts",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* Thin TeXise lifecycle wrapper around the upstream y-websocket provider."
    },
    {
      "path": "packages/js-lib/project-collaboration/src/texise-websocket-provider.ts",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* in TeXise itself. BF25 deliberately delegates those responsibilities to the"
    },
    {
      "path": "packages/js-lib/project-collaboration/src/texise-websocket-provider.ts",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* mature Yjs provider architecture. TeXise retains only room"
    },
    {
      "path": "packages/js-lib/project-git/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Browser-first Git contracts and binary-safe project working-tree synchronization for TeXise.\","
    },
    {
      "path": "packages/js-lib/project-git/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/project-git/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/project-git/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/project-git/src/__tests__/browser-settings-r31.spec.ts",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "DEFAULT_TEXISE_GIT_CORS_PROXY,"
    },
    {
      "path": "packages/js-lib/project-git/src/__tests__/browser-settings-r31.spec.ts",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_AUTHOR_EMAIL_STORAGE_KEY,"
    },
    {
      "path": "packages/js-lib/project-git/src/__tests__/browser-settings-r31.spec.ts",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_AUTHOR_NAME_STORAGE_KEY,"
    },
    {
      "path": "packages/js-lib/project-git/src/__tests__/browser-settings-r31.spec.ts",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_CORS_PROXY_STORAGE_KEY,"
    },
    {
      "path": "packages/js-lib/project-git/src/__tests__/browser-settings-r31.spec.ts",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "corsProxy: DEFAULT_TEXISE_GIT_CORS_PROXY,"
    },
    {
      "path": "packages/js-lib/project-git/src/__tests__/browser-settings-r31.spec.ts",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "expect(isDefaultPublicGitCorsProxy(`${DEFAULT_TEXISE_GIT_CORS_PROXY}/`)).toBe(true);"
    },
    {
      "path": "packages/js-lib/project-git/src/__tests__/browser-settings-r31.spec.ts",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "window.localStorage.setItem(TEXISE_GIT_AUTHOR_NAME_STORAGE_KEY, 'Ada Lovelace');"
    },
    {
      "path": "packages/js-lib/project-git/src/__tests__/browser-settings-r31.spec.ts",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "window.localStorage.setItem(TEXISE_GIT_AUTHOR_EMAIL_STORAGE_KEY, 'ada@example.org');"
    },
    {
      "path": "packages/js-lib/project-git/src/__tests__/browser-settings-r31.spec.ts",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "window.localStorage.setItem(TEXISE_GIT_CORS_PROXY_STORAGE_KEY, '');"
    },
    {
      "path": "packages/js-lib/project-git/src/__tests__/browser-settings-r31.spec.ts",
      "line": 30,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "expect(readBrowserGitSettings().corsProxy).toBe(DEFAULT_TEXISE_GIT_CORS_PROXY);"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 1,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_GIT_AUTHOR_NAME_STORAGE_KEY = 'texise-git-author-name';"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 2,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_GIT_AUTHOR_EMAIL_STORAGE_KEY = 'texise-git-author-email';"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 3,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_GIT_CORS_PROXY_STORAGE_KEY = 'texise-git-cors-proxy';"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TEXISE_GIT_CORS_PROXY_CONFIGURED_STORAGE_KEY = 'texise-git-cors-proxy-r31-configured';"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const DEFAULT_TEXISE_GIT_CORS_PROXY = 'https://cors.isomorphic-git.org';"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const stored = readLocalStorage(TEXISE_GIT_CORS_PROXY_STORAGE_KEY);"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "readLocalStorage(TEXISE_GIT_CORS_PROXY_CONFIGURED_STORAGE_KEY) === '1';"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return stored?.trim() || DEFAULT_TEXISE_GIT_CORS_PROXY;"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 38,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "globalThis.localStorage.setItem(TEXISE_GIT_CORS_PROXY_STORAGE_KEY, value);"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 39,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "globalThis.localStorage.setItem(TEXISE_GIT_CORS_PROXY_CONFIGURED_STORAGE_KEY, '1');"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "authorName: readLocalStorage(TEXISE_GIT_AUTHOR_NAME_STORAGE_KEY)?.trim() ?? '',"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 48,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "authorEmail: readLocalStorage(TEXISE_GIT_AUTHOR_EMAIL_STORAGE_KEY)?.trim() ?? '',"
    },
    {
      "path": "packages/js-lib/project-git/src/browser-settings.ts",
      "line": 54,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return value.trim().replace(/\\/+$/u, '') === DEFAULT_TEXISE_GIT_CORS_PROXY;"
    },
    {
      "path": "packages/js-lib/project-git/src/index.ts",
      "line": 2,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "DEFAULT_TEXISE_GIT_CORS_PROXY,"
    },
    {
      "path": "packages/js-lib/project-git/src/index.ts",
      "line": 3,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_AUTHOR_EMAIL_STORAGE_KEY,"
    },
    {
      "path": "packages/js-lib/project-git/src/index.ts",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_AUTHOR_NAME_STORAGE_KEY,"
    },
    {
      "path": "packages/js-lib/project-git/src/index.ts",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_GIT_CORS_PROXY_STORAGE_KEY,"
    },
    {
      "path": "packages/js-lib/project-git/src/isomorphic-git-engine.ts",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* persistent Git object database/index while TeXise ProjectStorageProvider"
    },
    {
      "path": "packages/js-lib/project-git/src/isomorphic-git-engine.ts",
      "line": 90,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`texise-git-${safeRepositoryId(options.repositoryId)}`,"
    },
    {
      "path": "packages/js-lib/project-git/src/isomorphic-git-engine.ts",
      "line": 96,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "name: 'TeXise User',"
    },
    {
      "path": "packages/js-lib/project-git/src/isomorphic-git-engine.ts",
      "line": 97,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "email: 'user@texise.local',"
    },
    {
      "path": "packages/js-lib/project-git/src/status.ts",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* TeXise change buckets. Stage=2 represents an indexed file matching workdir;"
    },
    {
      "path": "packages/js-lib/project-git/src/types.ts",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* TeXise-facing Git engine contract. Browser implementation details such as"
    },
    {
      "path": "packages/js-lib/project-git/src/types.ts",
      "line": 88,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "/** Remove browser-local Git object/index state for a deleted TeXise project. */"
    },
    {
      "path": "packages/js-lib/project-meaning/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Browser-local semantic project chunking and embedding contracts for TeXise.\","
    },
    {
      "path": "packages/js-lib/project-meaning/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/project-meaning/package.json",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/project-meaning/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": { \"env\": \"universal\", \"kind\": \"library\" },"
    },
    {
      "path": "packages/js-lib/project-rag/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Trusted local project retrieval and evidence contracts for TeXise RAG.\","
    },
    {
      "path": "packages/js-lib/project-rag/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/project-rag/package.json",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/project-rag/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": { \"env\": \"universal\", \"kind\": \"library\" },"
    },
    {
      "path": "packages/js-lib/project-runtime/package.json",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/project-semantic-index/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Lossless range-based LaTeX project semantic index for TeXise.\","
    },
    {
      "path": "packages/js-lib/project-semantic-index/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/project-semantic-index/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/project-semantic-index/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/project-semantic-index/src/__tests__/semantic-index.spec.ts",
      "line": 534,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('keeps TeXise canonical literal escapes as editable prose while unknown commands remain protected', () => {"
    },
    {
      "path": "packages/js-lib/project-semantic-index/src/index.ts",
      "line": 524,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* text-like. This is deliberately capability-based: TeXise never keys Visual"
    },
    {
      "path": "packages/js-lib/project-semantic-index/src/index.ts",
      "line": 656,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Only ordinary text plus TeXise's canonical literal escapes is safe to"
    },
    {
      "path": "packages/js-lib/project-semantic-index/src/index.ts",
      "line": 863,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// TeXise serializes ordinary literal %, &, #, _, $, { and } using these"
    },
    {
      "path": "packages/js-lib/project-storage/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Binary-safe project paths, storage contracts, metadata, and ZIP portability for TeXise projects.\","
    },
    {
      "path": "packages/js-lib/project-storage/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/project-storage/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/project-storage/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/project-storage/src/__tests__/project-bootstrap.spec.ts",
      "line": 3,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "DEFAULT_TEXISE_MAIN_TEX,"
    },
    {
      "path": "packages/js-lib/project-storage/src/__tests__/project-bootstrap.spec.ts",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": ").toBe(DEFAULT_TEXISE_MAIN_TEX);"
    },
    {
      "path": "packages/js-lib/project-storage/src/__tests__/project-config.spec.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('TeXise project config', () => {"
    },
    {
      "path": "packages/js-lib/project-storage/src/__tests__/project-templates.spec.ts",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "author: 'TeXise',"
    },
    {
      "path": "packages/js-lib/project-storage/src/__tests__/project-templates.spec.ts",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('TeXise project template manifest', () => {"
    },
    {
      "path": "packages/js-lib/project-storage/src/__tests__/project-templates.spec.ts",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "id: 'article', slug: 'article', name: 'Article', description: '', category: 'Academic', author: 'TeXise', tier: 'free', tags: [], degreeLevels: [], requiredPackages: [], features: [],"
    },
    {
      "path": "packages/js-lib/project-storage/src/__tests__/project-templates.spec.ts",
      "line": 92,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "id: 'uncategorised', slug: 'uncategorised', name: 'Uncategorised', description: '', category: '', author: 'TeXise', tier: 'free', tags: [], degreeLevels: [], requiredPackages: [], features: [],"
    },
    {
      "path": "packages/js-lib/project-storage/src/browser-capabilities.ts",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// navigator.storage.persist(). TeXise never requests that permission"
    },
    {
      "path": "packages/js-lib/project-storage/src/index.ts",
      "line": 33,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "DEFAULT_TEXISE_PROJECT_CONFIG,"
    },
    {
      "path": "packages/js-lib/project-storage/src/index.ts",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_PROJECT_CONFIG_VERSION,"
    },
    {
      "path": "packages/js-lib/project-storage/src/index.ts",
      "line": 44,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "DEFAULT_TEXISE_MAIN_TEX,"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-bootstrap.ts",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const DEFAULT_TEXISE_MAIN_TEX = String.raw`\\documentclass{article}"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-bootstrap.ts",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "new TextEncoder().encode(DEFAULT_TEXISE_MAIN_TEX),"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 3,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_PROJECT_CONFIG_VERSION = 1 as const;"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "version: typeof TEXISE_PROJECT_CONFIG_VERSION;"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* Compile proves that this project needs Docker TeX Live Full, TeXise keeps"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 31,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const DEFAULT_TEXISE_PROJECT_CONFIG: TexiseProjectConfig = Object.freeze({"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "version: TEXISE_PROJECT_CONFIG_VERSION,"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 44,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "version: DEFAULT_TEXISE_PROJECT_CONFIG.version,"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 45,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "rootFile: DEFAULT_TEXISE_PROJECT_CONFIG.rootFile,"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 46,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "compiler: DEFAULT_TEXISE_PROJECT_CONFIG.compiler,"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "compileTarget: DEFAULT_TEXISE_PROJECT_CONFIG.compileTarget,"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 48,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "pdfCompileMode: DEFAULT_TEXISE_PROJECT_CONFIG.pdfCompileMode,"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 49,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assets: { ...DEFAULT_TEXISE_PROJECT_CONFIG.assets },"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-config.ts",
      "line": 59,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "candidate.version !== TEXISE_PROJECT_CONFIG_VERSION ||"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-templates.ts",
      "line": 88,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "provenance?: 'official' | 'adapted' | 'community' | 'texise';"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-templates.ts",
      "line": 119,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const TEMPLATE_MANIFEST_URL = '/texise-templates/templates.json';"
    },
    {
      "path": "packages/js-lib/project-storage/src/project-templates.ts",
      "line": 258,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "provenance: ['official','adapted','community','texise'].includes(String(item.provenance || '')) ? item.provenance as ProjectTemplateDefinition['provenance'] : undefined,"
    },
    {
      "path": "packages/js-lib/project-storage/src/text-file-policy.ts",
      "line": 1,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TEXISE_EDITABLE_TEXT_EXTENSIONS = new Set(["
    },
    {
      "path": "packages/js-lib/project-storage/src/text-file-policy.ts",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* Text files TeXise may edit as source without converting them through the"
    },
    {
      "path": "packages/js-lib/project-storage/src/text-file-policy.ts",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return TEXISE_EDITABLE_TEXT_EXTENSIONS.has(leaf.slice(dot));"
    },
    {
      "path": "packages/js-lib/project-storage/src/text-file-policy.ts",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* Text files that TeXise research features may safely decode and inspect."
    },
    {
      "path": "packages/js-lib/prosemirror-editor/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/prosemirror-editor/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/prosemirror-editor/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/__tests__/math.spec.ts",
      "line": 480,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc(p(mathInline(String.raw`\\gdef\\texisemacro{A}\\texisemacro`))),"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/__tests__/math.spec.ts",
      "line": 483,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "doc(p(mathInline(String.raw`\\texisemacro`))),"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/__tests__/math.spec.ts",
      "line": 495,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "String.raw`\\texisemacro`,"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/common/collection.ts",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TEXISE_METADATA = Symbol('TEXISE_METADATA');"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/common/collection.ts",
      "line": 52,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return (item as any)[TEXISE_METADATA] ?? null;"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/common/collection.ts",
      "line": 90,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "(item as any)[TEXISE_METADATA] = {"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/link/link.ts",
      "line": 114,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const LINK_OPEN_MODIFIER_CLASS = 'texise-link-open-modifier';"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/math.ts",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* NodeView, with TeXise-owned Markdown, input, clipboard, and renderer limits."
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/math.ts",
      "line": 124,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Only rehydrate TeXise's own serialized node tags. The upstream aliases"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/math.ts",
      "line": 175,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "mathView.dom.dataset.texiseMathView = '';"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/pm-utils/__tests__/helpers.spec.ts",
      "line": 83,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['hello https://google.com two https://www.texise.com', 2],"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/pm-utils/__tests__/helpers.spec.ts",
      "line": 84,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['hello https://google.com https://www.texise.com', 2],"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/pm-utils/__tests__/helpers.spec.ts",
      "line": 85,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['https://google.com https://www.texise.com', 2],"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/pm-utils/__tests__/helpers.spec.ts",
      "line": 86,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['https://google.com t https://www.texise.com ', 2],"
    },
    {
      "path": "packages/js-lib/prosemirror-editor/src/pm-utils/__tests__/helpers.spec.ts",
      "line": 87,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['https://google.com 🙆‍♀️ https://www.texise.com 👯‍♀️', 2],"
    },
    {
      "path": "packages/js-lib/prosemirror-plugins/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/prosemirror-plugins/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/prosemirror-plugins/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/scientific-runtime/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Runtime-neutral scientific execution contracts, lifecycle management, package registry, and artifact helpers for TeXise.\","
    },
    {
      "path": "packages/js-lib/scientific-runtime/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/scientific-runtime/package.json",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": { \"env\": \"browser\", \"kind\": \"library\" },"
    },
    {
      "path": "packages/js-lib/scientific-runtime/src/index.ts",
      "line": 84,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "? ['fine-grained Python interruption is unavailable; TeXise will terminate and lazily recreate the worker']"
    },
    {
      "path": "packages/js-lib/scientific-runtime/src/index.ts",
      "line": 177,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "/** Optional bounded stdin supplied by TeXise pipelines to finite WASI tools. */"
    },
    {
      "path": "packages/js-lib/terminal/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Capability-safe browser terminal domain for TeXise.\","
    },
    {
      "path": "packages/js-lib/terminal/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/terminal/package.json",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": { \"env\": \"browser\", \"kind\": \"library\" },"
    },
    {
      "path": "packages/js-lib/terminal/src/index.ts",
      "line": 169,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "reason: 'AI tool is not registered in TeXise.',"
    },
    {
      "path": "packages/js-lib/terminal/src/index.ts",
      "line": 199,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "return { capability, action: 'deny', reason: 'AI tool is not registered in TeXise.' };"
    },
    {
      "path": "packages/js-lib/terminal/src/index.ts",
      "line": 343,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "reason: 'Command is not registered in the TeXise browser terminal.',"
    },
    {
      "path": "packages/js-lib/wordgard-markdown/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/wordgard-markdown/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/wordgard-markdown/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/wordgard-markdown/src/codec.ts",
      "line": 158,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* The batteries-included codec for TeXise notes: the schema and Markdown"
    },
    {
      "path": "packages/js-lib/wordgard-markdown/src/index.ts",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* Use {@link createNoteMarkdownCodec} for the batteries-included TeXise"
    },
    {
      "path": "packages/js-lib/wordgard-plus/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/wordgard-plus/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/wordgard-plus/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/js-lib/wordgard-utils/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/js-lib/wordgard-utils/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/js-lib/wordgard-utils/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/platform/embedding-browser/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Browser-local EmbeddingGemma worker runtime and vector persistence for TeXise.\","
    },
    {
      "path": "packages/platform/embedding-browser/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/platform/embedding-browser/package.json",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/platform/embedding-browser/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": { \"env\": \"browser\", \"kind\": \"library\" },"
    },
    {
      "path": "packages/platform/embedding-browser/src/embedding.worker.ts",
      "line": 12,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const META_DB = 'texise-embedding-model-v1';"
    },
    {
      "path": "packages/platform/embedding-browser/src/index.ts",
      "line": 11,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const DB_NAME = 'texise-project-meaning-v1';"
    },
    {
      "path": "packages/platform/embedding-browser/src/index.ts",
      "line": 83,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "name: 'texise-embedding-gemma',"
    },
    {
      "path": "packages/platform/latex-compiler-browser/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Worker-backed browser LaTeX compiler adapters and TeX Live package resolution for TeXise.\","
    },
    {
      "path": "packages/platform/latex-compiler-browser/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/platform/latex-compiler-browser/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/platform/latex-compiler-browser/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_LIVE_DRAFT_DIR,"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_LIVE_DRAFT_LUA_NAME,"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_LIVE_DRAFT_RECORD_NAME,"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_LIVE_DRAFT_WRAPPER_NAME,"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "path: `${TEXISE_LIVE_DRAFT_DIR}/${TEXISE_LIVE_DRAFT_RECORD_NAME}`,"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 48,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const isProbe = String(request.rootFile).startsWith(`${TEXISE_LIVE_DRAFT_DIR}/`);"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 104,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "projectFilePath(`${TEXISE_LIVE_DRAFT_DIR}/${TEXISE_LIVE_DRAFT_WRAPPER_NAME}`),"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 109,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "(file) => file.path === projectFilePath(`${TEXISE_LIVE_DRAFT_DIR}/${TEXISE_LIVE_DRAFT_WRAPPER_NAME}`),"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 112,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "(file) => file.path === projectFilePath(`${TEXISE_LIVE_DRAFT_DIR}/${TEXISE_LIVE_DRAFT_LUA_NAME}`),"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 116,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "expect(new TextDecoder().decode(probe?.content)).toContain(TEXISE_LIVE_DRAFT_LUA_NAME);"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 134,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "path: `${TEXISE_LIVE_DRAFT_DIR}/${TEXISE_LIVE_DRAFT_RECORD_NAME}`,"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 167,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "path: TEXISE_LIVE_DRAFT_RECORD_NAME,"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 199,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "expect(renderRequest?.files.some((file) => String(file.path).includes(TEXISE_LIVE_DRAFT_WRAPPER_NAME))).toBe(false);"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 230,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(warmRequest?.rootFile).toBe(projectFilePath('__texise_live_instant_warm__.tex'));"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-live-lua-compiler-r4.spec.ts",
      "line": 233,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(request?.rootFile).toBe(projectFilePath('paper/__texise_live_instant__.tex'));"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-remote-cache-r14-24-1.spec.ts",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const ORIGIN = 'https://app.texise.test';"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-remote-cache-r14-24-1.spec.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const goodUrl = `${ORIGIN}/__texise/busytex-remote/none/good.sty`;"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-remote-cache-r14-24-1.spec.ts",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const poisonedUrl = `${ORIGIN}/__texise/busytex-remote/none/poisoned.sty`;"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/__tests__/busytex-remote-cache-r14-24-1.spec.ts",
      "line": 153,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const auxUrl = `${ORIGIN}/__texise/busytex-remote/26/main.aux`;"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/browser-latex-compiler.ts",
      "line": 163,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "engine.reason ?? `${request.compiler} is not available in this TeXise deployment`,"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/browser-latex-compiler.ts",
      "line": 172,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "'This project requests Biber. Install the BusyTeX 1.4+ full browser compiler profile to compile biblatex/Biber projects in TeXise.',"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TEXISE_BUSYTEXT_ADAPTER_RELEASE = 'buildfix25';"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 105,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const BUSYTEX_LEGACY_SHIM_MARKER = 'TEXISE_BUSYTEXT_LEGACY_NO_BIBER_SHIM_V1';"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 179,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return requested === '__texise_live__' ? `${requested}/${normalized}` : normalized;"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 221,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(path) => path === 'layout.jsonl' || path === '__texise_live__/layout.jsonl',"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 223,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (!hasLiveRecord) await read('__texise_live__');"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 274,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "return `${url}${separator}texise_asset=${encodeURIComponent(fingerprint.slice(0, 16))}`;"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const BUSYTEX_WORKER_BRIDGE_URL = '/compiler/texise-busytex-worker-bridge.js';"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 365,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "url.searchParams.set('texise_bridge', 'buildfix25');"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 375,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// must be redirected to TeXise's same-origin compatibility bridge too."
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 588,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "console.info(`[BusyTeX] TeXise compiler adapter ${TEXISE_BUSYTEXT_ADAPTER_RELEASE} active`);"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 732,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'This deployment is using the TeXise BusyTeX legacy compatibility shim. PDF/Xe/Lua compilation and SyncTeX are available, but Biber requires the native BusyTeX 1.4 pipeline. Use BibTeX or install the native v1.4 runtime before compiling this biblatex document.',"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-adapter.ts",
      "line": 736,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// TeXise always calls the public 1.4 runner API. The isolated TeXise"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 17,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_LIVE_DRAFT_DIR = '__texise_live__';"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_LIVE_DRAFT_WRAPPER_NAME = 'probe.tex';"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_LIVE_DRAFT_LUA_NAME = 'probe.lua';"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_LIVE_DRAFT_RECORD_NAME = 'layout.jsonl';"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const INSTANT_WARM_ROOT = projectFilePath('__texise_live_instant_warm__.tex');"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 42,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return projectFilePath(`${TEXISE_LIVE_DRAFT_DIR}/${name}`);"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 49,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return projectFilePath(`${dir}__texise_live_instant__.tex`);"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* R4 is deliberately a tiny TeXise-owned runtime certificate. It does not"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 79,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\\directlua{dofile(\"${TEXISE_LIVE_DRAFT_LUA_NAME}\")}"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 80,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\\AddToHook{shipout/before}{\\directlua{texise_live_shipout()}}"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 81,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\\AddToHook{enddocument/afterlastpage}{\\directlua{texise_live_finalize()}}"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 83,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "TeXise Live PDF runtime feasibility.\\par"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 92,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return String.raw`local out = assert(io.open(\"${TEXISE_LIVE_DRAFT_RECORD_NAME}\", \"w\"))"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 102,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function texise_live_shipout()"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 107,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "function texise_live_finalize()"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 120,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const expected = `${TEXISE_LIVE_DRAFT_DIR}/${TEXISE_LIVE_DRAFT_RECORD_NAME}`;"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 123,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return path === expected || path === TEXISE_LIVE_DRAFT_RECORD_NAME;"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 281,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const rootFile = probePath(TEXISE_LIVE_DRAFT_WRAPPER_NAME);"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 283,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "asTextFile(probePath(TEXISE_LIVE_DRAFT_LUA_NAME), liveLuaProbe()),"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 410,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// keystroke does not pay WASM/runtime startup. This document is TeXise-owned"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts",
      "line": 423,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "TeXise instant preview warm-up."
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-remote-cache.ts",
      "line": 1,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const REMOTE_CACHE_NAME_PREFIX = 'texise-busytex-remote-v3-';"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/busytex-remote-cache.ts",
      "line": 2,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const REMOTE_CACHE_PREFIX = '/__texise/busytex-remote/';"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/index.ts",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export { BusyTexLiveLuaCompiler, TEXISE_LIVE_DRAFT_DIR } from './busytex-live-lua-compiler';"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/swiftlatex-adapter.ts",
      "line": 48,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const existing = document.querySelector<HTMLScriptElement>(`script[data-texise-compiler=\"${src}\"]`);"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/swiftlatex-adapter.ts",
      "line": 56,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "script.dataset.texiseCompiler = src;"
    },
    {
      "path": "packages/platform/latex-compiler-browser/src/swiftlatex-adapter.ts",
      "line": 180,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (!data || data.type !== 'texise-texlive-resolution') return;"
    },
    {
      "path": "packages/platform/local-ai-browser/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Browser-local Gemma model storage and LiteRT-LM worker runtime for TeXise.\","
    },
    {
      "path": "packages/platform/local-ai-browser/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/platform/local-ai-browser/package.json",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/platform/local-ai-browser/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/platform/local-ai-browser/src/index.ts",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "name: 'texise-local-ai',"
    },
    {
      "path": "packages/platform/local-ai-browser/src/litert-main-runtime.ts",
      "line": 13,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const STORE_DIRECTORY = 'texise-local-ai-v1';"
    },
    {
      "path": "packages/platform/local-ai-browser/src/litert-main-runtime.ts",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* request contents, routing, credentials, or TeXise privacy policy."
    },
    {
      "path": "packages/platform/local-ai-browser/src/litert-main-runtime.ts",
      "line": 154,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "'LiteRT-LM was started in an incompatible worker context. Reload TeXise after installing this build; inference now runs from the supported browser-module context.',"
    },
    {
      "path": "packages/platform/local-ai-browser/src/local-ai.worker.ts",
      "line": 9,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const STORE_DIRECTORY = 'texise-local-ai-v1';"
    },
    {
      "path": "packages/platform/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texiseWorkspaceConfig\": {"
    },
    {
      "path": "packages/platform/paper-memory-browser/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Browser-local OPFS/IndexedDB storage and PDF.js worker extraction for TeXise Paper Memory.\","
    },
    {
      "path": "packages/platform/paper-memory-browser/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/platform/paper-memory-browser/package.json",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/platform/paper-memory-browser/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": { \"env\": \"browser\", \"kind\": \"library\" },"
    },
    {
      "path": "packages/platform/paper-memory-browser/src/index.ts",
      "line": 13,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const DB_NAME = 'texise-paper-memory-v1';"
    },
    {
      "path": "packages/platform/paper-memory-browser/src/index.ts",
      "line": 18,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const OPFS_ROOT = 'texise-paper-memory';"
    },
    {
      "path": "packages/platform/paper-memory-browser/src/index.ts",
      "line": 118,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "throw new Error(`Paper Memory schema ${String(schemaVersion)} is not supported by this TeXise build (expected ${PAPER_MEMORY_SCHEMA_VERSION}).`);"
    },
    {
      "path": "packages/platform/paper-memory-browser/src/index.ts",
      "line": 299,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "name: 'texise-paper-memory-index',"
    },
    {
      "path": "packages/platform/python-browser/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Worker-backed Pyodide scientific Python runtime for TeXise.\","
    },
    {
      "path": "packages/platform/python-browser/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/platform/python-browser/package.json",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/platform/python-browser/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/platform/python-browser/src/index.ts",
      "line": 60,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "name: 'texise-scientific-python',"
    },
    {
      "path": "packages/platform/python-browser/src/python.worker.ts",
      "line": 159,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": ": request.sourceName ?? '<texise-python>';"
    },
    {
      "path": "packages/platform/python-browser/src/python.worker.ts",
      "line": 160,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const isRepl = request.mode === 'code' && request.sourceName === '<texise-repl>';"
    },
    {
      "path": "packages/platform/python-browser/src/python.worker.ts",
      "line": 164,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "await runtime.runPythonAsync('import code as _texise_code\\n_texise_console = _texise_code.InteractiveConsole()');"
    },
    {
      "path": "packages/platform/python-browser/src/python.worker.ts",
      "line": 167,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "wrapper = `_texise_console.push(${pythonString(userCode)})`;"
    },
    {
      "path": "packages/platform/python-browser/src/python.worker.ts",
      "line": 180,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`_texise_globals = {'__name__': '__main__', '__file__': ${pythonString(sourceName)}}`,"
    },
    {
      "path": "packages/platform/python-browser/src/python.worker.ts",
      "line": 181,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`exec(compile(${pythonString(userCode)}, ${pythonString(sourceName)}, 'exec'), _texise_globals, _texise_globals)`,"
    },
    {
      "path": "packages/platform/r-browser/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Worker-backed webR scientific R runtime for TeXise.\","
    },
    {
      "path": "packages/platform/r-browser/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/platform/r-browser/package.json",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/platform/r-browser/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/platform/r-browser/src/index.ts",
      "line": 245,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const wrapper = `local({\\n  setwd(${rString(cwd)})\\n  .texise_args <- ${argumentVector}\\n  commandArgs <- function(trailingOnly=FALSE) {\\n    if (trailingOnly) return(.texise_args)\\n    c(${rString('Rscript')}, ${rString(`--file=${programName}`)}, .texise_args)\\n  }\\n  tryCatch({\\n    ${execution}\\n    TRUE\\n  }, error=function(e) {\\n    message(paste0('Error: ', conditionMessage(e)))\\n    FALSE\\n  })\\n})`;"
    },
    {
      "path": "packages/platform/r-browser/src/index.ts",
      "line": 271,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const path = `figures/texise-r-plot-${startedAt}-${plotIndex}.png`;"
    },
    {
      "path": "packages/platform/service-platform/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/platform/service-platform/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/platform/service-platform/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/platform/service-platform/src/__tests__/idb-database-upgrade.spec.ts",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'Close or reload other TeXise tabs',"
    },
    {
      "path": "packages/platform/service-platform/src/idb-database.ts",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const DB_NAME = 'texise-db';"
    },
    {
      "path": "packages/platform/service-platform/src/idb-database.ts",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// local projects/preferences can be migrated once into the TeXise database."
    },
    {
      "path": "packages/platform/service-platform/src/idb-database.ts",
      "line": 138,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "this.logger.info('Migrated legacy local TeXise data', { records: migrated });"
    },
    {
      "path": "packages/platform/service-platform/src/idb-database.ts",
      "line": 142,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "// legacy database untouched and continue with the new TeXise database."
    },
    {
      "path": "packages/platform/service-platform/src/idb-database.ts",
      "line": 233,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "? 'TeXise could not upgrade its database. Close or reload other TeXise tabs, then reload this tab.'"
    },
    {
      "path": "packages/platform/service-platform/src/idb-database.ts",
      "line": 234,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": ": 'TeXise could not open its database in time. Reload this tab and try again.',"
    },
    {
      "path": "packages/platform/service-platform/src/project-storage-indexeddb.ts",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const DIRECTORY_MARKER = '.texise-directory';"
    },
    {
      "path": "packages/platform/service-platform/src/project-storage-indexeddb.ts",
      "line": 55,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// IndexedDB has no first-class empty directories. TeXise materializes"
    },
    {
      "path": "packages/platform/service-platform/src/project-storage-opfs.ts",
      "line": 4,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const PROJECT_ROOT_DIRECTORY = 'texise-projects';"
    },
    {
      "path": "packages/platform/service-platform/src/router/__tests__/hash-strategy.spec.ts",
      "line": 179,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "])('should decode TeXise editor file %s from a deep link', (fileName) => {"
    },
    {
      "path": "packages/platform/wasi-browser/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Browser-local Wasmer/WASIX runtime with Clang C/C++ compilation for TeXise.\","
    },
    {
      "path": "packages/platform/wasi-browser/package.json",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/platform/wasi-browser/package.json",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/platform/wasi-browser/package.json",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/platform/wasi-browser/src/index.ts",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* the TeXise CSP. Pinning avoids an unreviewed runtime upgrade changing the"
    },
    {
      "path": "packages/platform/wasi-browser/src/index.ts",
      "line": 84,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "'WASI/WASIX requires a cross-origin-isolated TeXise deployment (COOP/COEP). ' +"
    },
    {
      "path": "packages/platform/wasi-browser/src/index.ts",
      "line": 243,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "if (!definition) throw new Error(`WASI utility is not in the TeXise certified catalogue: ${name}`);"
    },
    {
      "path": "packages/platform/wasi-browser/src/index.ts",
      "line": 347,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// that TeXise can positively identify as project files or output targets;"
    },
    {
      "path": "packages/shared/base-utils/__tests__/github-buger-url.spec.ts",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const parsed = new URL(url, 'https://www.texise.com');"
    },
    {
      "path": "packages/shared/base-utils/__tests__/github-buger-url.spec.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const parsed = new URL(url, 'https://www.texise.com');"
    },
    {
      "path": "packages/shared/base-utils/__tests__/throw-app-error.spec.ts",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('handleAppError correctly processes a TeXise error', () => {"
    },
    {
      "path": "packages/shared/base-utils/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/shared/base-utils/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/shared/base-utils/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/shared/commands/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/shared/commands/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/shared/commands/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/shared/commands/src/__tests__/commands.spec.ts",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// index.commandExcludedServices@texise.constants"
    },
    {
      "path": "packages/shared/commands/src/__tests__/commands.spec.ts",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "import { areAllValuesOptional, texiseAppCommands } from '../index';"
    },
    {
      "path": "packages/shared/commands/src/__tests__/commands.spec.ts",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const allCommands: Command[] = texiseAppCommands;"
    },
    {
      "path": "packages/shared/commands/src/__tests__/commands.spec.ts",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('TeXise App Commands Validation', () => {"
    },
    {
      "path": "packages/shared/commands/src/__tests__/commands.spec.ts",
      "line": 184,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "it('registers the TeXise professional editor shortcut set centrally', () => {"
    },
    {
      "path": "packages/shared/commands/src/index.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export const texiseAppCommands = ["
    },
    {
      "path": "packages/shared/commands/src/index.ts",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export type TexiseAppCommand = (typeof texiseAppCommands)[number];"
    },
    {
      "path": "packages/shared/commands/src/index.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "validate(texiseAppCommands);"
    },
    {
      "path": "packages/shared/config/compile-config.ts",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const rawInjectedConfig = __TEXISE_INJECTED_CONFIG__ || null;"
    },
    {
      "path": "packages/shared/config/compile-config.ts",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return __TEXISE_BUILD_TIME_CONFIG__;"
    },
    {
      "path": "packages/shared/config/compile-config.ts",
      "line": 62,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return process.env.__TEXISE_BUILD_TIME_CONFIG__;"
    },
    {
      "path": "packages/shared/config/index.ts",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_HOT = config.build.hot;"
    },
    {
      "path": "packages/shared/config/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/shared/config/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/shared/config/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/shared/constants/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/shared/constants/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/shared/constants/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/shared/constants/product.ts",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "legacyProtocol: 'web+texise',"
    },
    {
      "path": "packages/shared/constants/product.ts",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "legacyStoragePrefix: 'texise:',"
    },
    {
      "path": "packages/shared/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texiseWorkspaceConfig\": {"
    },
    {
      "path": "packages/shared/root-emitter/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/shared/root-emitter/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/shared/root-emitter/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/shared/translations/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/shared/translations/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/shared/translations/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/shared/translations/src/build-support.ts",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export const LOCALE_APPLY_GLOBAL = '__texiseApplyLocale';"
    },
    {
      "path": "packages/shared/translations/src/languages/de.ts",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texiseLogoAlt: 'Learnitive Logo',"
    },
    {
      "path": "packages/shared/translations/src/languages/en.ts",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texiseLogoAlt: 'Learnitive logo',"
    },
    {
      "path": "packages/shared/types/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/shared/types/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/shared/types/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/shared/ws-path/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/shared/ws-path/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/shared/ws-path/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/internal-link.spec.ts",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "WsFilePath.fromString('notes:folder/texise.com.md'),"
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/internal-link.spec.ts",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "WsFilePath.fromString('notes:folder/bugs in texise.com.md'),"
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/internal-link.spec.ts",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(resolveWikiLinkTarget(home, 'texise.com', index)?.wsPath).toBe("
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/internal-link.spec.ts",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'notes:folder/texise.com.md',"
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/internal-link.spec.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "resolveWikiLinkTarget(home, 'bugs in texise.com', index)?.wsPath,"
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/internal-link.spec.ts",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ").toBe('notes:folder/bugs in texise.com.md');"
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/ws-path-specialized.spec.ts",
      "line": 240,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dirPath = WsDirPath.fromString('texise-notes:.texise/backups');"
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/ws-path-specialized.spec.ts",
      "line": 241,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(dirPath.wsName).toBe('texise-notes');"
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/ws-path-specialized.spec.ts",
      "line": 242,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(dirPath.path).toBe('.texise/backups/');"
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/ws-path.spec.ts",
      "line": 310,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const wsPath = WsPath.fromString('texise-notes:.texise/backups');"
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/ws-path.spec.ts",
      "line": 314,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(wsPath.wsName).toBe('texise-notes');"
    },
    {
      "path": "packages/shared/ws-path/src/__tests__/ws-path.spec.ts",
      "line": 315,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(wsPath.path).toBe('.texise/backups/');"
    },
    {
      "path": "packages/tooling/browser-entry/package.json",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/tooling/browser-entry/public/compiler/status.json",
      "line": 68,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"bundleId\": \"texise-swiftlatex-r3-core-v2\","
    },
    {
      "path": "packages/tooling/browser-entry/public/learnitive-texlive-sw.js",
      "line": 3,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CACHE_NAME = 'texise-texlive-swiftlatex-r14-7-v1';"
    },
    {
      "path": "packages/tooling/browser-entry/public/learnitive-texlive-sw.js",
      "line": 4,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CACHE_PREFIX = 'texise-texlive-swiftlatex-';"
    },
    {
      "path": "packages/tooling/browser-entry/public/learnitive-texlive-sw.js",
      "line": 5,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CONFIG_CACHE = 'texise-texlive-config-v1';"
    },
    {
      "path": "packages/tooling/browser-entry/public/learnitive-texlive-sw.js",
      "line": 6,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CONFIG_URL = '/__texise/texlive-config';"
    },
    {
      "path": "packages/tooling/browser-entry/public/learnitive-texlive-sw.js",
      "line": 7,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const APP_CACHE = 'texise-app-shell-r14-28-20-buildfix51-4-v1';"
    },
    {
      "path": "packages/tooling/browser-entry/public/learnitive-texlive-sw.js",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const APP_CACHE_PREFIX = 'texise-app-shell-';"
    },
    {
      "path": "packages/tooling/browser-entry/public/learnitive-texlive-sw.js",
      "line": 277,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "client.postMessage({ type: 'texise-texlive-resolution', ...resolution });"
    },
    {
      "path": "packages/tooling/browser-entry/public/learnitive-texlive-sw.js",
      "line": 398,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "url.pathname.startsWith('/__texise/') ||"
    },
    {
      "path": "packages/tooling/browser-entry/public/texise-templates/templates.json",
      "line": 45,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "\"provenance\": \"texise\","
    },
    {
      "path": "packages/tooling/browser-entry/public/texise-texlive-sw.js",
      "line": 3,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CACHE_NAME = 'texise-texlive-swiftlatex-r14-7-v1';"
    },
    {
      "path": "packages/tooling/browser-entry/public/texise-texlive-sw.js",
      "line": 4,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CACHE_PREFIX = 'texise-texlive-swiftlatex-';"
    },
    {
      "path": "packages/tooling/browser-entry/public/texise-texlive-sw.js",
      "line": 5,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CONFIG_CACHE = 'texise-texlive-config-v1';"
    },
    {
      "path": "packages/tooling/browser-entry/public/texise-texlive-sw.js",
      "line": 6,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CONFIG_URL = '/__texise/texlive-config';"
    },
    {
      "path": "packages/tooling/browser-entry/public/texise-texlive-sw.js",
      "line": 7,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const APP_CACHE = 'texise-app-shell-r14-28-20-buildfix51-4-v1';"
    },
    {
      "path": "packages/tooling/browser-entry/public/texise-texlive-sw.js",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const APP_CACHE_PREFIX = 'texise-app-shell-';"
    },
    {
      "path": "packages/tooling/browser-entry/public/texise-texlive-sw.js",
      "line": 277,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "client.postMessage({ type: 'texise-texlive-resolution', ...resolution });"
    },
    {
      "path": "packages/tooling/browser-entry/public/texise-texlive-sw.js",
      "line": 398,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "url.pathname.startsWith('/__texise/') ||"
    },
    {
      "path": "packages/tooling/browser-entry/public/texlive/bundle.json",
      "line": 3,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"bundleId\": \"texise-swiftlatex-r3-core-v2\","
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 662,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-yellow:#DA0B4E;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 663,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-yellow-strong:#B80A42;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 664,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-border:#d7dce3;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 665,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-bg:#f7f8fa;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 666,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-panel:#ffffff;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 667,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-muted:#eef1f5;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 668,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-fg:#171a1f;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 669,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-subtle:#667085;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 670,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-tool-bg:#ffffff;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 671,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-tool-hover:#fff7cf;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 672,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-tool-active:#DA0B4E;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 673,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-tool-fg:#111111;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 675,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "body { font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; background:var(--texise-bg); color:var(--texise-fg); }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 676,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".header { background:var(--texise-panel)!important; color:var(--texise-fg)!important; border-bottom:1px solid var(--texise-border); min-height:48px; padding:6px 10px!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 677,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".header h1 { color:var(--texise-fg)!important; font-size:15px!important; letter-spacing:-.01em; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 678,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".main, .canvas-container { background:var(--texise-bg)!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 679,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".toolbar, .right-panel, .panel-section, .status-bar { background:var(--texise-panel)!important; color:var(--texise-fg)!important; border-color:var(--texise-border)!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 684,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background:var(--texise-tool-bg)!important;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 685,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color:var(--texise-tool-fg)!important;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 686,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border:1px solid var(--texise-border)!important;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 691,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background:var(--texise-tool-hover)!important;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 692,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color:var(--texise-tool-fg)!important;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 693,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-color:var(--texise-yellow-strong)!important;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 696,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background:var(--texise-tool-active)!important;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 697,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color:var(--texise-tool-fg)!important;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 698,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-color:var(--texise-yellow-strong)!important;"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 701,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".tool .icon { color:var(--texise-tool-fg)!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 702,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".tool-divider { background:var(--texise-border)!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 703,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".btn { border:1px solid var(--texise-border)!important; background:#ffffff!important; color:#111111!important; border-radius:7px!important; box-shadow:none!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 704,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".btn:hover { background:var(--texise-tool-hover)!important; border-color:var(--texise-yellow-strong)!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 705,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".btn-primary { background:var(--texise-yellow)!important; border-color:var(--texise-yellow-strong)!important; color:#111111!important; font-weight:600; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 706,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".btn-primary:hover { background:var(--texise-yellow-strong)!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 707,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button[disabled] { background:#f6f7f9!important; border-color:var(--texise-border)!important; color:#98a2b3!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 708,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".panel-header { background:var(--texise-muted)!important; color:var(--texise-fg)!important; border-color:var(--texise-border)!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 709,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".object-item.selected, .subobject.selected { background:var(--texise-tool-hover)!important; color:#111111!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 710,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".checkbox-row input { accent-color:var(--texise-yellow-strong)!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 711,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "input, select, textarea { background:var(--texise-panel)!important; color:var(--texise-fg)!important; border-color:var(--texise-border)!important; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 712,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".modal-content { background:var(--texise-panel)!important; color:var(--texise-fg)!important; border:1px solid var(--texise-border); }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 714,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ":root { --texise-border:#303641; --texise-bg:#111318; --texise-panel:#191c22; --texise-muted:#242933; --texise-fg:#f2f4f7; --texise-subtle:#a7afbd; }"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 791,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "<button class=\"btn btn-primary\" id=\"texiseInsertBtn\" onclick=\"app.insertIntoTeXise()\"><svg class=\"icon\" aria-hidden=\"true\"><use href=\"#i-export\"/></svg> Insert TikZ</button>"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 7860,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "texiseExportPayload() {"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 7879,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "insertIntoTeXise() {"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 7885,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "source: 'texise-tikz-draw',"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 7887,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "payload: this.texiseExportPayload(),"
    },
    {
      "path": "packages/tooling/browser-entry/public/tikz-draw/index.html",
      "line": 8712,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "window.parent.postMessage({ source: 'texise-tikz-draw', type: 'ready' }, window.location.origin);"
    },
    {
      "path": "packages/tooling/browser-entry/pwa-manifest.ts",
      "line": 143,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "name: 'texise-pwa-manifest',"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/pwa-manifest.spec.ts",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "{ protocol: 'web+texise', url: '/?launch=%s' },"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/pwa-manifest.spec.ts",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "url: 'https://www.texise.com/site.webmanifest',"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/pwa-manifest.spec.ts",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "id: 'https://www.texise.com/',"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/pwa-manifest.spec.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "getPwaManifestSource('https://www.texise.com/'),"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/pwa-manifest.spec.ts",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ").toBe('https://www.texise.com');"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/pwa-manifest.spec.ts",
      "line": 84,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "url: 'https://www.texise.com/site.webmanifest',"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/pwa-manifest.spec.ts",
      "line": 85,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "id: 'https://www.texise.com/',"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/ws-boot-surface.spec.ts",
      "line": 2,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "import { resolveTeXiseBootSurface } from '../ws-boot-surface';"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/ws-boot-surface.spec.ts",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('TeXise /ws boot surface', () => {"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/ws-boot-surface.spec.ts",
      "line": 6,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "expect(resolveTeXiseBootSurface('/ws', '#route=editor&wsPath=ghfgh%3Amain.tex')).toBe('editor');"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/ws-boot-surface.spec.ts",
      "line": 10,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "expect(resolveTeXiseBootSurface('/ws', '#route=editor\\\\&wsPath=ghfgh%3Amain.tex')).toBe('editor');"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/ws-boot-surface.spec.ts",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "expect(resolveTeXiseBootSurface('/ws', '#route=welcome')).toBe('home');"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/ws-boot-surface.spec.ts",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "expect(resolveTeXiseBootSurface('/ws/', '#route=welcome')).toBe('home');"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/ws-boot-surface.spec.ts",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "expect(resolveTeXiseBootSurface('/ws', '#route=welcome&legacy=true')).toBe('home');"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/ws-boot-surface.spec.ts",
      "line": 21,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "expect(resolveTeXiseBootSurface('/ws', '#route=editor&wsPath=notes%3Awelcome.md')).toBe('editor');"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/ws-boot-surface.spec.ts",
      "line": 25,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "expect(resolveTeXiseBootSurface('/ws', '')).toBe('projects');"
    },
    {
      "path": "packages/tooling/browser-entry/src/__tests__/ws-boot-surface.spec.ts",
      "line": 29,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "expect(resolveTeXiseBootSurface('/projects', '')).toBe('saas');"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 117,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-desktop-platform] .desktop-titlebar-drag {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-window-controls-overlay=\"visible\"] .desktop-titlebar-drag {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 129,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-desktop-platform] .desktop-titlebar-no-drag {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 135,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-window-controls-overlay=\"visible\"]"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 142,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-window-controls-overlay=\"visible\"]"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 146,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "calc(var(--texise-titlebar-right-inset) + 0.5rem)"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 152,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-window-controls-overlay=\"visible\"]:is("
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 153,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[data-texise-window-controls-overlay-controls=\"left\"],"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 154,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[data-texise-window-controls-overlay-controls=\"both\"]"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 161,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "calc(var(--texise-titlebar-left-inset) + 0.5rem)"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 165,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-desktop-platform=\"darwin\"]"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 172,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-desktop-platform=\"darwin\"] .desktop-sidebar-titlebar-header {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 176,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-window-controls-overlay=\"visible\"]:is("
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 177,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[data-texise-window-controls-overlay-controls=\"left\"],"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 178,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[data-texise-window-controls-overlay-controls=\"both\"]"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 183,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "calc(var(--texise-titlebar-area-height) + 0.25rem)"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 187,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-window-controls-overlay=\"visible\"][data-texise-window-controls-overlay-controls=\"right\"]"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 286,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-app-titlebar-height: 40px;"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 287,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-titlebar-area-x: 0px;"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 288,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-titlebar-area-y: 0px;"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 289,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-titlebar-area-width: 100vw;"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 290,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-titlebar-area-height: var(--texise-app-titlebar-height);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 291,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-titlebar-left-inset: var(--texise-titlebar-area-x);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 292,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-titlebar-right-inset: calc("
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 293,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "100vw - var(--texise-titlebar-area-x) - var(--texise-titlebar-area-width)"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 368,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 390,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor > * {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 394,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor:focus,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 395,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 396,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .ProseMirror:focus,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 397,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .ProseMirror:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 398,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .ProseMirror-focused {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 403,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-heading,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 404,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-paragraph,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 405,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-item,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 406,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table td,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 407,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-theorem-body,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 408,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-inline:not([contenteditable='false']) {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 411,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-heading {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 416,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor h1.texise-visual-heading { font-size: 1.9rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 417,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor h2.texise-visual-heading { font-size: 1.65rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 418,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor h3.texise-visual-heading { font-size: 1.38rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 419,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-paragraph {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 424,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-synthetic-paragraph {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 428,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-hard-break {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 431,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-synthetic-inline {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 437,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-raw {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 444,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-raw-label {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 451,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-raw pre {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 460,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-inline {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 463,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-inline-bold {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 466,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-inline-italic {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 469,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-inline-underline {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 473,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-inline-monospace {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 474,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 477,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-inline-link {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 481,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-inline-raw {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 491,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 496,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 501,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-item {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 505,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-inline-citation,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 506,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-inline-reference,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 507,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-inline-footnote {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 518,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-raw-inline {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 528,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 537,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-raw-inline:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 538,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-raw-inline:focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 545,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-text-environment {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 551,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-text-environment-header {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 555,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 560,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-text-environment-body {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 564,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-text-environment-body:focus-within {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 568,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-source-trivia,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 569,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-source-trivia-inline {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 573,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-raw-block {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 593,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-raw-block.ProseMirror-selectednode {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 600,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-clickable:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 601,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-clickable:focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 606,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-clickable:active {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 609,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-header {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 618,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 622,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-action {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 632,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-action:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 633,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-action:focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 639,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-summary,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 640,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-caption,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 641,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-footer {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 644,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 647,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-caption {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 651,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-source {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 661,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 667,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-source:empty::before {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 670,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 672,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-source-label {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 676,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 681,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-figure-source {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 685,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-document-setup {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 692,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-protected-table {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 696,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-figure {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 706,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-figure-preview-grid {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 712,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-figure-preview-grid .texise-visual-figure-image {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 720,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-figure-image {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 727,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-figure-placeholder {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 735,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 738,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-figure-asset-placeholder {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 746,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-meta {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 749,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 752,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-wrap {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 756,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-toolbar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 767,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-wrap:hover .texise-visual-list-toolbar,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 768,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-wrap:focus-within .texise-visual-list-toolbar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 771,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-actions button,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 772,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 778,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-actions {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 781,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 790,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-actions-summary::-webkit-details-marker { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 791,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-actions-summary:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 792,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-actions[open] .texise-visual-list-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 795,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-actions-menu {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 808,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-actions-menu button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 815,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-actions-menu button:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 818,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-list-actions-menu .texise-visual-list-destructive {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 821,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-wrap {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 827,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-toolbar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 840,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor ~ .texise-visual-native-table-toolbar,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 841,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 851,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar[hidden],"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 852,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar[hidden] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 855,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-meta-button,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 856,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions button,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 857,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 863,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-meta-button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 873,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 876,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 885,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-summary::-webkit-details-marker {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 888,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-summary:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 889,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions[open] .texise-visual-table-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 892,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-menu {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 905,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-menu button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 912,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-menu button:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 915,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-menu hr {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 921,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-destructive {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 925,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 932,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar .texise-visual-list-actions {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 935,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar .texise-visual-list-actions button,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 936,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar .texise-visual-list-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 942,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar .texise-visual-list-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 951,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar .texise-visual-list-actions-summary::-webkit-details-marker {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 954,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar .texise-visual-list-actions-summary:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 955,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar .texise-visual-list-actions[open] .texise-visual-list-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 958,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar .texise-visual-list-actions-menu {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 971,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar .texise-visual-list-actions-menu button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 978,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar .texise-visual-list-actions-menu button:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 981,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-list-toolbar .texise-visual-list-destructive {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 984,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-meta-button,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 985,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions button,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 986,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 992,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-meta-button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1002,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1005,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1014,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions-summary::-webkit-details-marker { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1015,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions-summary:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1016,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions[open] .texise-visual-table-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1019,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions-menu {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1032,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions-menu button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1039,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions-menu button:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1042,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions-menu hr {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1048,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table-actions-menu .texise-visual-table-destructive {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1051,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1058,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table td {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1065,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-theorem {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1071,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-theorem-title {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1076,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-theorem-body {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1081,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-source-reveal {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1088,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1098,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math-editable {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1103,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math-editable:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1104,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math-editable:focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1109,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math-protected {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1113,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math-editing {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1117,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math-display {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1127,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math-field-host {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1135,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math-header {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1140,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math-field {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1148,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math-field-display {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1157,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-math-field-inline {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1168,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pdf-text-layer {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1179,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pdf-text-layer :is(span, br) {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1188,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pdf-text-layer span.markedContent {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1193,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pdf-text-layer ::selection,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1194,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pdf-text-layer span::selection {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1199,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pdf-text-layer .texise-pdf-search-hit {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1205,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pdf-text-layer .texise-pdf-search-active {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1211,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor > [data-source-id] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1216,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor > [data-source-id]:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1219,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-block-handle {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1222,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-block-handle.hidden {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1225,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-dragging {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1228,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-drop-target {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1231,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-selection-toolbar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1245,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-selection-toolbar.hidden {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1248,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-selection-button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1263,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-selection-button:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1264,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-selection-button:focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1270,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-block-handle [data-drag-handle] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1273,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-drop-target {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1276,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-drop-before {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1279,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-drop-after {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1284,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".latex-bedrive-resizer.texise-drive-browser-editor-resizer {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1333,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".latex-bedrive-resizer.texise-drive-browser-editor-resizer:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1334,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".latex-bedrive-resizer.texise-drive-browser-editor-resizer.is-dragging {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1338,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".latex-bedrive-resizer.texise-drive-browser-editor-resizer:hover"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1340,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".latex-bedrive-resizer.texise-drive-browser-editor-resizer.is-dragging"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1347,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".latex-bedrive-resizer.texise-drive-browser-editor-resizer:focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1366,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-comment-anchor {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1373,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-comment-resolved { opacity: 0.65; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1374,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-comment-outdated {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1380,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-change-anchor {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1386,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-change-insert {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1390,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-change-replace {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1394,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-change-delete {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1398,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-change-deletion-widget {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1409,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-change-deletion-widget-block {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1415,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1419,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-change-deletion-protected {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1423,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-change-deletion-protected .texise-visual-protected-source {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1432,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .prosemirror-flat-list.texise-visual-list-item {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1437,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .prosemirror-flat-list.texise-visual-list-item > .list-content > .texise-visual-paragraph {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1442,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .prosemirror-flat-list.texise-visual-list-item::before,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1443,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .prosemirror-flat-list.texise-visual-list-item > .list-marker {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1449,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-paragraph[data-placeholder] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1455,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1465,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1479,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-summary:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1480,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions[open] .texise-visual-table-actions-summary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1484,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-menu {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1491,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-menu-label {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1497,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-visual-native-table-toolbar .texise-visual-table-actions-menu button[data-active='true']::after {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1504,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table[data-table-align='left'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1509,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table[data-table-align='center'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/index.css",
      "line": 1514,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-latex-visual-editor .texise-visual-table[data-table-align='right'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 3,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "import './texise-design.css';"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 21,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "import { TeXiseSiteTelemetry } from './site-telemetry';"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "installTeXiseLocationChangeBridge,"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 24,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "resolveTeXiseBootSurface,"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_LOCATION_CHANGE_EVENT,"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "type TeXiseBootSurface,"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 36,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TEXISE_REQUIRED_FONT_FACES = ["
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 47,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "async function waitForTeXiseFonts(logger: Logger) {"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 51,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "await Promise.race([Promise.all(TEXISE_REQUIRED_FONT_FACES.map((face) => document.fonts.load(face))).then(() => undefined), timeout]);"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 52,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const missing = TEXISE_REQUIRED_FONT_FACES.filter((face) => !document.fonts.check(face));"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 60,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "installTeXiseLocationChangeBridge(window);"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 80,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "const bootSurface = resolveTeXiseBootSurface(bootLocation.pathname, bootLocation.hash);"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 95,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "await waitForTeXiseFonts(logger);"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 96,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "document.documentElement.dataset.texiseFontsReady = 'true';"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 102,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise_io_channel',"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 132,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "const currentSurface = resolveTeXiseBootSurface(window.location.pathname, window.location.hash);"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 146,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "const initialSurface = resolveTeXiseBootSurface(window.location.pathname, window.location.hash);"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 159,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "<TeXiseRootApplication"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 197,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "type TeXiseRootApplicationProps = {"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 198,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "initialSurface: Exclude<TeXiseBootSurface, 'home' | 'projects'>;"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 209,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "function TeXiseRootApplication({"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 215,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "}: TeXiseRootApplicationProps) {"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 216,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "const [surface, setSurface] = React.useState<Exclude<TeXiseBootSurface, 'home' | 'projects'>>(initialSurface);"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 220,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "const next = resolveTeXiseBootSurface(window.location.pathname, window.location.hash);"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 233,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "window.addEventListener(TEXISE_LOCATION_CHANGE_EVENT, synchronize);"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 237,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "window.removeEventListener(TEXISE_LOCATION_CHANGE_EVENT, synchronize);"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 241,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "document.documentElement.dataset.texiseSurface = surface;"
    },
    {
      "path": "packages/tooling/browser-entry/src/main.tsx",
      "line": 251,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "<TeXiseSiteTelemetry />"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-site-shell {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 9,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-page-container {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 10,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "width: min(calc(100% - 2rem), var(--texise-content-width));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 14,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-site-header {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 22,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-site-header .texise-header-inner {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-4xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-header {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 42,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-header-inner {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 49,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-header .texise-header-inner { min-height: 3.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 51,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-brand {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 61,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-brand-logo {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 65,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-brand-logo {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 72,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-brand-name {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 77,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-public-nav,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 78,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-nav {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 85,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-nav { margin-left: 1rem; margin-right: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 87,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-public-nav a,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 88,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-nav a,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 89,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mobile-nav a {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 95,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "transition: opacity var(--texise-transition-fast), color var(--texise-transition-fast);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 98,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-public-nav a:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 99,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-nav a:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 100,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mobile-nav a:hover { opacity: 1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 102,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-header-actions {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 109,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-button,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 110,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-icon-button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 114,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "transition: background-color var(--texise-transition-fast), border-color var(--texise-transition-fast), transform var(--texise-transition-fast), box-shadow var(--texise-transition-fast), color var(--texise-transition-fast);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 117,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 124,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-lg);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 131,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-button-sm { min-height: 2.05rem; padding: .4rem .7rem; font-size: .8125rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 132,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-button-lg { min-height: 2.8rem; padding: .7rem 1.05rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 133,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-button-primary { background: var(--texise-yellow); color: var(--texise-navy); border-color: color-mix(in srgb, var(--texise-yellow-strong) 70%, var(--texise-navy)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 134,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-button-primary:hover { background: var(--texise-yellow-strong); transform: translateY(-1px); box-shadow: 0 7px 18px rgb(0 29 56 / .10); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 135,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-button-secondary { background: var(--secondary); color: var(--secondary-foreground); border-color: var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 136,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-button-secondary:hover { background: color-mix(in srgb, var(--secondary) 82%, var(--foreground) 6%); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 137,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-button-ghost { color: var(--foreground); background: transparent; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 138,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-button-ghost:hover { background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 140,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-icon-button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 145,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-lg);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 149,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-icon-button:hover { background: var(--secondary); border-color: var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 150,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-button:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 151,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-icon-button:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 152,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-site-shell a:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 153,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-site-shell button:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 154,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-site-shell input:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 155,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-site-shell textarea:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 156,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-site-shell select:focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 161,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mobile-menu-button { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 162,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mobile-nav {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 170,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-account-menu { position: relative; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 171,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-avatar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 185,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-avatar img { width: 100%; height: 100%; object-fit: cover; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 186,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-avatar-loading { opacity: .45; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 187,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-account-popover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 196,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 202,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-account-popover > strong,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 203,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-account-popover > span { padding-inline: .5rem; overflow: hidden; text-overflow: ellipsis; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 204,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-account-popover > span { color: var(--muted-foreground); font-size: .78rem; padding-bottom: .4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 205,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-account-popover a,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 206,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-account-popover button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 213,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-md);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 222,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-account-popover a:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 223,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-account-popover button:hover { background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 224,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-account-popover-portal { position: fixed; right: auto; z-index: 220; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 226,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero { padding-block: clamp(5rem, 10vw, 9rem) clamp(4rem, 8vw, 7rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 227,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-eyebrow {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 232,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color: color-mix(in srgb, var(--foreground) 76%, var(--texise-blue));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 238,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-display { margin: 0; color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 239,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero .texise-display {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 245,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-copy {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 252,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-actions { display: flex; align-items: center; flex-wrap: wrap; gap: .7rem; margin-top: 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 253,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-text-link { display: inline-flex; align-items: center; gap: .25rem; color: var(--foreground); font-weight: 600; text-decoration: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 254,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-text-link:hover { text-decoration: underline; text-underline-offset: .2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 256,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-band { border-block: 1px solid var(--border); background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 257,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid { display: grid; grid-template-columns: repeat(4, 1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 258,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid article { min-height: 13.5rem; padding: 2rem; border-right: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 259,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid article:first-child { border-left: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 260,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid svg { color: var(--texise-blue); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 261,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid h2 { margin: 2.25rem 0 .6rem; font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 262,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid p { margin: 0; color: var(--muted-foreground); line-height: 1.55; font-size: .9rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 264,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-section { padding-block: clamp(4rem, 7vw, 7rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 265,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-section-heading { max-width: 50rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 266,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-section-heading .texise-display,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 267,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-page-heading .texise-display { font-size: clamp(2.35rem, 5vw, 4.9rem); line-height: .98; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 268,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-section-heading .texise-display { font-weight: 300; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 269,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-page-heading .texise-display { font-weight: 400; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 270,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps { margin: 3rem 0 0; padding: 0; list-style: none; display: grid; grid-template-columns: repeat(5, 1fr); border-block: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 271,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps li { min-height: 9rem; padding: 1.25rem; border-right: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 272,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps li:first-child { border-left: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 273,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps li span { display: block; color: var(--texise-blue); font-size: .72rem; font-weight: 700; margin-bottom: 2.1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 274,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps strong { font-size: .9rem; line-height: 1.4; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 276,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-page-heading { padding-block: clamp(4rem, 8vw, 7rem) 2.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 277,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-page-heading > p { max-width: 48rem; margin: 1.25rem 0 0; color: var(--muted-foreground); font-size: 1.05rem; line-height: 1.65; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 278,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-card-grid { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 1rem; padding-bottom: 5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 279,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-marketing-card,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 280,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 281,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 282,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-settings-card,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 283,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-danger-card,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 284,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-auth-card,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 285,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-empty-state {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 287,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-2xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 291,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-marketing-card { min-height: 12rem; padding: 1.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 292,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-marketing-card h2 { margin: 0 0 .7rem; font-size: 1.05rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 293,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-marketing-card p { color: var(--muted-foreground); line-height: 1.6; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 295,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filters { display: grid; grid-template-columns: minmax(13rem, 1fr) auto auto auto; gap: .65rem; align-items: center; margin-bottom: 1.15rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 296,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filters select,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 297,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cms-editor + select,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 298,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-support select,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 299,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-actions select {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 302,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-lg);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 308,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-segmented { display: inline-flex; padding: .2rem; border: 1px solid var(--border); border-radius: var(--texise-radius-lg); background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 309,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-segmented button { border: 0; border-radius: .34rem; padding: .38rem .7rem; background: transparent; color: var(--muted-foreground); font: inherit; font-size: .8rem; cursor: pointer; text-transform: capitalize; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 310,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-segmented button[data-active='true'] { background: var(--card); color: var(--foreground); box-shadow: 0 1px 5px rgb(0 29 56 / .08); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 311,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card { overflow: hidden; min-width: 0; align-self: start; height: fit-content; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 312,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card > img,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 313,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-placeholder { width: 100%; aspect-ratio: 16/10; display: grid; place-items: center; object-fit: cover; background: var(--secondary); border-bottom: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 314,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-placeholder svg { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 315,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-body { padding: 1.2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 316,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-card-meta { display: flex; justify-content: space-between; align-items: center; gap: .5rem; color: var(--muted-foreground); font-size: .72rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 317,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card h2 { margin: .75rem 0 .5rem; font-size: 1.05rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 318,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card p { min-height: 3.2rem; color: var(--muted-foreground); font-size: .88rem; line-height: 1.55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 319,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-badge { display: inline-flex; align-items: center; gap: .25rem; padding: .2rem .45rem; border-radius: 999px; background: var(--secondary); color: var(--foreground); font-size: .68rem; font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 320,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-badge-pro { background: color-mix(in srgb, var(--texise-yellow) 70%, var(--card)); color: var(--texise-navy); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 322,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-detail { display: grid; grid-template-columns: minmax(0,1.3fr) minmax(18rem,.7fr); gap: clamp(1.5rem,4vw,4rem); padding-block: clamp(3rem,6vw,6rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 323,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-preview { min-height: 28rem; display: grid; place-items: center; overflow: hidden; border: 1px solid var(--border); border-radius: var(--texise-radius-2xl); background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 324,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-preview img { width: 100%; height: 100%; object-fit: contain; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 325,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-detail-copy { align-self: start; position: sticky; top: 6rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 326,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-detail-copy .texise-display { font-size: clamp(2.3rem,4vw,4.5rem); line-height: 1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 327,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-detail-copy > p { color: var(--muted-foreground); line-height: 1.65; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 328,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tag-row { display: flex; gap: .4rem; flex-wrap: wrap; margin: 1.1rem 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 329,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tag-row span { padding: .25rem .5rem; border-radius: 999px; background: var(--secondary); color: var(--muted-foreground); font-size: .72rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 330,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-button { margin-top: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 331,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-storage-choice { display: grid; grid-template-columns: repeat(2,1fr); gap: .75rem; margin-top: .5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 332,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-storage-choice button { min-height: 7rem; display: grid; place-items: center; gap: .4rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); color: var(--card-foreground); font: inherit; cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 333,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-storage-choice button:hover { border-color: var(--ring); background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 335,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-grid { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 1rem; max-width: 58rem; padding-bottom: 6rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 336,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card { padding: 1.7rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 337,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-featured { border-color: color-mix(in srgb, var(--texise-yellow) 72%, var(--border)); box-shadow: 0 12px 42px rgb(0 29 56 / .08); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 338,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card .texise-display { font-size: 2.3rem; font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 339,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card ul { padding-left: 1.15rem; color: var(--muted-foreground); line-height: 1.9; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 340,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-stat-line { display: flex; align-items: baseline; gap: .5rem; margin-block: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 341,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-stat-line strong { font-size: 2.2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 343,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-content-list { display: grid; gap: .6rem; padding-bottom: 5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 344,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-content-list a { display: grid; grid-template-columns: 1fr auto; gap: .35rem 1rem; padding: 1.15rem 1.25rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); color: var(--card-foreground); text-decoration: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 345,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-content-list a:hover { border-color: color-mix(in srgb, var(--ring) 45%, var(--border)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 346,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-content-list strong { font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 347,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-content-list p { grid-column: 1 / -1; margin: 0; color: var(--muted-foreground); font-size: .88rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 348,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-content-list time,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 349,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-content-list small { color: var(--muted-foreground); font-size: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 351,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-index { display: grid; grid-template-columns: minmax(13rem,15rem) minmax(0,1fr); gap: clamp(1.5rem,4vw,3.5rem); padding-bottom: 5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 352,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-layout { display: grid; grid-template-columns: minmax(13rem,15rem) minmax(0,1fr) minmax(10rem,13rem); gap: clamp(1.35rem,3vw,2.75rem); align-items: start; padding-top: clamp(2.5rem,5vw,5rem); padding-bottom: 5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 353,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-sidebar { min-width: 0; align-self: start; position: sticky; top: 5.5rem; display: grid; gap: 1rem; max-height: calc(100vh - 7rem); overflow: auto; padding-right: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-mobile-bar { display: none; padding-top: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 355,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-mobile-navigation { display: flex; justify-content: flex-start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 356,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-drawer { width: min(36rem,calc(100vw - 1rem)); max-height: min(80vh,46rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 357,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-drawer-scroll { min-height: 0; overflow: auto; padding-right: .25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 358,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-nav { display: grid; gap: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 359,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-nav section { display: grid; gap: .15rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 360,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-nav h2 { margin: 0 0 .25rem; padding-inline: .55rem; color: var(--foreground); font-size: .72rem; font-weight: 700; letter-spacing: .06em; text-transform: uppercase; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 361,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-nav a { padding: .43rem .55rem; border-radius: .35rem; color: var(--muted-foreground); text-decoration: none; font-size: .84rem; line-height: 1.3; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 362,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-nav a:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 363,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-nav a[data-active='true'] { background: var(--secondary); color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 364,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-nav a[data-active='true'] { font-weight: 600; box-shadow: inset 2px 0 0 var(--texise-yellow-strong); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 365,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-filter { height: 2.35rem; display: flex; align-items: center; gap: .45rem; padding: 0 .65rem; border: 1px solid var(--border); border-radius: var(--texise-radius-lg); background: var(--card); color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 366,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-filter:focus-within { border-color: var(--ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 16%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 367,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-filter input { min-width: 0; width: 100%; border: 0; outline: 0; background: transparent; color: var(--foreground); font: inherit; font-size: .84rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 368,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-results { min-width: 0; display: grid; align-content: start; gap: 1.7rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 369,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-results > section { display: grid; gap: .4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 370,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-results h2 { margin: 0 0 .35rem; font-family: var(--texise-font-display); font-size: 1.7rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 371,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-results a { display: flex; justify-content: space-between; align-items: center; gap: 1rem; padding: .85rem .95rem; border: 1px solid var(--border); border-radius: var(--texise-radius-lg); background: var(--card); color: var(--foreground); text-decoration: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 372,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-results a:hover { border-color: color-mix(in srgb, var(--ring) 42%, var(--border)); background: color-mix(in srgb, var(--secondary) 38%, var(--card)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 373,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-results a span { min-width: 0; display: grid; gap: .18rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 374,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-results a small { color: var(--muted-foreground); font-size: .78rem; line-height: 1.45; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 375,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-article { width: 100%; max-width: 55rem; min-width: 0; padding-block: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 376,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-article > header { margin-bottom: 2.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 377,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-breadcrumb { display: flex; align-items: center; flex-wrap: wrap; gap: .45rem; margin-bottom: 1rem; color: var(--muted-foreground); font-size: .78rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 378,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-breadcrumb a { color: inherit; text-decoration: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 379,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-breadcrumb a:hover { color: var(--foreground); text-decoration: underline; text-underline-offset: .2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 380,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-excerpt { max-width: 47rem; font-size: 1.08rem; line-height: 1.65; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 381,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-toc { position: sticky; top: 5.5rem; min-width: 0; display: grid; gap: .75rem; padding-left: 1rem; border-left: 1px solid var(--border); color: var(--muted-foreground); font-size: .78rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 382,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-toc > strong { color: var(--foreground); font-size: .75rem; letter-spacing: .02em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 383,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-toc nav { display: grid; gap: .15rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 384,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-toc a { padding: .28rem .15rem; color: inherit; text-decoration: none; line-height: 1.35; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 385,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-toc a[data-level='3'] { padding-left: .8rem; font-size: .74rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 386,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-toc a:hover { color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 387,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose :is(h2,h3) { scroll-margin-top: 6.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 388,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose pre { position: relative; padding-top: 2.65rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 389,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-code-copy { position: absolute; top: .55rem; right: .55rem; min-height: 1.7rem; padding: .25rem .5rem; border: 1px solid rgb(255 255 255 / .2); border-radius: .4rem; background: rgb(255 255 255 / .08); color: inherit; font: 500 .68rem/1 var(--texise-font-ui); cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 390,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-code-copy:hover { background: rgb(255 255 255 / .14); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 391,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose table { width: 100%; border-collapse: collapse; margin: 1.5rem 0; font-size: .9rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 392,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose th { text-align: left; font-weight: 650; background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 393,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose :is(th,td) { padding: .7rem .8rem; border: 1px solid var(--border); vertical-align: top; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 394,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose table { display: block; max-width: 100%; overflow-x: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 395,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose blockquote { margin: 1.35rem 0; padding: .9rem 1rem .95rem; border: 1px solid color-mix(in srgb, var(--texise-yellow) 58%, var(--border)); border-left: .24rem solid var(--texise-yellow-strong); border-radius: var(--texise-radius-lg); background: color-mix(in srgb, var(--texise-yellow) 10%, var(--card)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 396,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose blockquote p { margin: .35rem 0; line-height: 1.62; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 397,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose blockquote p:first-child { margin-top: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 398,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose blockquote p:last-child { margin-bottom: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 399,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose p > a[href='https://ollama.com/download'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 406,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 1px solid color-mix(in srgb, var(--texise-yellow) 72%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 407,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-lg);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 408,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 409,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color: var(--texise-graphite-950);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 415,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose p > a[href='https://ollama.com/download']:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 416,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-yellow-strong);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 419,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-prose p > a[href='https://ollama.com/download']:focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 425,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose-page { max-width: 55rem; padding-block: clamp(3rem,6vw,6rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 426,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose-page > header { margin-bottom: 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 427,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose-page > header .texise-display { font-size: clamp(2.4rem,5vw,4.6rem); line-height: 1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 428,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose-page > header p { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 429,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose { font-size: 1rem; line-height: 1.75; color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 430,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose :is(h1,h2,h3) { scroll-margin-top: 6rem; line-height: 1.18; margin: 2rem 0 .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 431,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose h2 { font-size: 1.55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 432,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose h3 { font-size: 1.18rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 433,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose p { margin: .8rem 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 434,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose a { color: var(--texise-blue); text-underline-offset: .18rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 435,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose pre { overflow: auto; padding: 1rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--texise-dark-800); color: #f8f6f2; font-family: var(--texise-font-mono); font-size: .86rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 436,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose code { font-family: var(--texise-font-mono); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 437,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prev-next { display: flex; justify-content: space-between; gap: 1rem; margin-top: 3rem; padding-top: 1rem; border-top: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 439,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-simple-page { max-width: 52rem; min-height: 55vh; padding-block: clamp(4rem,8vw,7rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 440,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-simple-page .texise-display { font-size: clamp(2.6rem,5vw,5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 441,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-simple-page > p { color: var(--muted-foreground); font-size: 1.05rem; line-height: 1.7; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 442,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-form-wrap { max-width: 42rem; padding-bottom: 6rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 443,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-form-wrap form,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 444,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-auth-card,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 445,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-settings-card,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 446,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-danger-card { display: grid; gap: .72rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 447,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-textarea { width: 100%; min-height: 9rem; resize: vertical; padding: .75rem; border: 1px solid var(--input); border-radius: var(--texise-radius-lg); background: var(--background); color: var(--foreground); font: inherit; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 448,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-honeypot { position: absolute !important; left: -10000px !important; width: 1px !important; height: 1px !important; overflow: hidden !important; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 449,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-error,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 450,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-success { padding: .7rem .85rem; border-radius: var(--texise-radius-lg); font-size: .86rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 451,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-error { background: color-mix(in srgb, var(--texise-danger) 12%, var(--card)); border: 1px solid color-mix(in srgb, var(--texise-danger) 35%, var(--border)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 452,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-success { background: color-mix(in srgb, var(--texise-success) 12%, var(--card)); border: 1px solid color-mix(in srgb, var(--texise-success) 35%, var(--border)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 453,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-muted { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 454,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-auth-note { font-size: .72rem; line-height: 1.45; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 456,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-auth-page,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 457,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-login { min-height: 100vh; display: grid; place-items: center; padding: 1.25rem; background: var(--background); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 458,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-auth-card { width: min(100%, 27rem); padding: 1.6rem; box-shadow: 0 18px 60px rgb(0 29 56 / .08); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 459,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-auth-card .texise-display { font-size: 2.4rem; line-height: 1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 460,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-auth-card > p { color: var(--muted-foreground); line-height: 1.55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 462,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-site-footer { margin-top: 4rem; border-top: 1px solid var(--border); background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 463,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-grid { display: grid; grid-template-columns: 1.4fr repeat(4,1fr); gap: 2rem; padding-block: 3.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 464,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-grid h2 { margin: 0 0 .8rem; font-size: .75rem; text-transform: uppercase; letter-spacing: .08em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 465,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-grid > div:not(.texise-footer-brand) { display: flex; flex-direction: column; gap: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 466,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-grid a { color: var(--muted-foreground); text-decoration: none; font-size: .85rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 467,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-grid a:hover { color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 468,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-brand p { max-width: 18rem; color: var(--muted-foreground); line-height: 1.55; font-size: .85rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 469,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-bottom { display: flex; justify-content: space-between; gap: 1rem; padding-block: 1rem 1.5rem; border-top: 1px solid var(--border); color: var(--muted-foreground); font-size: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 471,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-search-results { max-height: min(24rem, 55vh); overflow: auto; display: grid; gap: .25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 472,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-search-results a { display: flex; justify-content: space-between; gap: 1rem; padding: .7rem .75rem; border-radius: .45rem; color: var(--foreground); text-decoration: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 473,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-search-results a:hover { background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 474,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-search-results small { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 477,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-main { padding-block: 2.3rem 4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 478,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-title-row { display: flex; align-items: end; justify-content: space-between; gap: 1rem; margin-bottom: 1.4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 479,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-title-row .texise-display { font-size: clamp(2.25rem,4vw,3.7rem); line-height: 1; font-weight: 400; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 480,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-title-row p { margin: .45rem 0 0; color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 481,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-primary-actions { display: flex; flex-wrap: wrap; gap: .5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 482,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-import-menu { position: relative; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 483,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-import-menu > summary { list-style: none; cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 484,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-import-menu > summary::-webkit-details-marker { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 485,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-import-popover { position: absolute; right: 0; top: calc(100% + .45rem); z-index: 30; min-width: 13.5rem; display: grid; gap: .15rem; padding: .4rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--popover); box-shadow: 0 16px 38px rgb(0 29 56 / .14); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 486,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-import-popover button { display: flex; align-items: center; gap: .55rem; width: 100%; border: 0; border-radius: .5rem; padding: .6rem .7rem; background: transparent; color: var(--foreground); font: inherit; font-size: .82rem; text-align: left; cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 487,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-import-popover button:hover { background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 488,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-list { display: grid; gap: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 489,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-row { min-height: 5.2rem; display: grid; grid-template-columns: 2.6rem minmax(0,1fr) auto; align-items: center; gap: .8rem; padding: .75rem .9rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 490,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-row:hover { border-color: color-mix(in srgb, var(--ring) 35%, var(--border)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 491,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-icon { width: 2.45rem; height: 2.45rem; display: grid; place-items: center; border-radius: .55rem; background: var(--secondary); color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 492,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-copy { min-width: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 493,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-copy h2 { margin: 0; font-size: .96rem; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 494,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-copy p { margin: .28rem 0 0; color: var(--muted-foreground); font-size: .78rem; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 495,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-row-actions { display: flex; align-items: center; gap: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 496,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-missing { border-style: dashed; background: color-mix(in srgb, var(--secondary) 55%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 497,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-row details { position: relative; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 498,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-row details > summary { list-style: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 499,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-row details > summary::-webkit-details-marker { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 500,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-row-menu { position: absolute; right: 0; top: calc(100% + .4rem); z-index: 20; min-width: 11rem; display: grid; padding: .35rem; border: 1px solid var(--border); border-radius: .65rem; background: var(--popover); box-shadow: 0 12px 34px rgb(0 29 56 / .13); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 501,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-row-menu button { display: flex; align-items: center; gap: .5rem; border: 0; border-radius: .35rem; padding: .48rem .6rem; background: transparent; color: var(--foreground); text-align: left; font: inherit; font-size: .8rem; cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 502,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-row-menu button:hover { background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 503,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-row-menu button.danger { color: var(--destructive-text); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 504,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-empty-state { padding: 2rem; text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 505,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-empty-state h2 { margin-top: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 506,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-empty-state p { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 508,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-projects-page--empty { min-height: clamp(32rem, 66dvh, 40rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 509,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-list--empty { min-height: clamp(28rem, 58dvh, 36rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 510,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-projects-empty-state {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 517,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-projects-empty-state .texise-projects-empty-copy {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 523,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-settings-grid { display: grid; grid-template-columns: minmax(0,1.25fr) minmax(18rem,.75fr); gap: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 524,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-settings-card,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 525,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-danger-card { padding: 1.25rem; align-content: start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 526,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-settings-card h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 527,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-danger-card h2 { margin: 0; font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 528,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-profile-row { display: grid; grid-template-columns: auto minmax(0,1fr); align-items: center; gap: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 529,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-settings-theme { display: flex; align-items: center; justify-content: space-between; gap: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 530,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-danger-card { border-color: color-mix(in srgb, var(--texise-danger) 35%, var(--border)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 531,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-inline-form { display: flex; align-items: center; gap: .55rem; flex-wrap: wrap; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 532,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-account-metadata { display: grid; gap: .15rem; color: var(--muted-foreground); font-size: .78rem; line-height: 1.5; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 533,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-settings-entitlement-stack { display: grid; gap: 1rem; align-content: start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 534,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-stat-line-compact { justify-content: space-between; margin-block: .45rem; padding-block: .2rem; border-bottom: 1px solid color-mix(in srgb, var(--border) 75%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 535,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-stat-line-compact:last-child { border-bottom: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 536,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-stat-line-compact strong { font-size: .9rem; text-align: right; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 537,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-license-link-card { border-color: color-mix(in srgb, var(--texise-yellow) 42%, var(--border)); background: color-mix(in srgb, var(--card) 96%, var(--texise-yellow) 4%); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 538,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-license-link-heading { display: grid; gap: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 539,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-license-link-heading .texise-eyebrow { margin-bottom: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 540,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-license-link-heading p { margin: 0 0 .25rem; color: var(--muted-foreground); font-size: .82rem; line-height: 1.5; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 541,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-license-success { display: flex; align-items: center; gap: .45rem; padding: .65rem .75rem; border: 1px solid color-mix(in srgb, #16a34a 35%, var(--border)); border-radius: var(--texise-radius-lg); background: color-mix(in srgb, #16a34a 8%, var(--card)); color: var(--foreground); font-size: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 542,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-license-error { margin: 0; color: var(--destructive); font-size: .78rem; line-height: 1.45; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 545,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell { min-height: 100vh; display: grid; grid-template-columns: 14rem minmax(0,1fr); background: var(--background); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 546,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell > aside { position: sticky; top: 0; height: 100vh; padding: 1rem; border-right: 1px solid var(--border); background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 547,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell > aside nav { display: grid; gap: .2rem; margin-top: 1.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 548,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell > aside nav a { padding: .5rem .6rem; border-radius: .4rem; color: var(--muted-foreground); text-decoration: none; font-size: .82rem; font-weight: 600; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 549,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell > aside nav a:hover { background: var(--card); color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 550,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell > div { min-width: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 551,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-top { height: 3.5rem; display: flex; justify-content: flex-end; align-items: center; gap: .45rem; padding-inline: 1.25rem; border-bottom: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 552,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell main { padding: 1.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 553,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-page-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; margin-bottom: 1.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 554,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-page-head .texise-display { font-size: 2.5rem; line-height: 1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 555,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-page-head p { margin: .45rem 0 0; color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 556,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-page-actions { display: flex; flex: 0 0 auto; align-items: center; gap: .5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 557,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-metrics { display: grid; grid-template-columns: repeat(4,minmax(0,1fr)); gap: .65rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 558,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-metrics article { padding: 1rem; border: 1px solid var(--border); border-radius: .75rem; background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 559,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-metrics span { display: block; color: var(--muted-foreground); font-size: .72rem; text-transform: capitalize; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 560,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-metrics strong { display: block; margin-top: .35rem; font-size: 1.6rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 561,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-table-wrap { max-width: 100%; overflow: auto; border: 1px solid var(--border); border-radius: .75rem; background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 562,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-table { width: 100%; border-collapse: collapse; font-size: .78rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 563,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-table th,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 564,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-table td { max-width: 18rem; padding: .65rem .7rem; border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; overflow-wrap: anywhere; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 565,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-table th { position: sticky; top: 0; background: var(--secondary); font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 566,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-actions { display: flex; gap: .35rem; white-space: nowrap; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 567,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-actions button { border: 1px solid var(--border); border-radius: .35rem; padding: .3rem .5rem; background: var(--background); color: var(--foreground); font: inherit; cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 568,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-cms { display: grid; grid-template-columns: minmax(18rem,.7fr) minmax(20rem,1.3fr); gap: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 569,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-cms > form { display: grid; gap: .55rem; align-self: start; padding: 1rem; border: 1px solid var(--border); border-radius: .75rem; background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 570,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-cms > form h2 { margin: 0 0 .4rem; font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 571,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cms-editor { min-height: 18rem; font-family: var(--texise-font-mono); font-size: .82rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 572,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-cms-list { display: grid; gap: .45rem; align-content: start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 573,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-cms-list article { display: flex; justify-content: space-between; gap: 1rem; align-items: center; padding: .75rem; border: 1px solid var(--border); border-radius: .65rem; background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 574,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-cms-list article > div:first-child { min-width: 0; display: grid; gap: .2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 575,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-cms-list article span { color: var(--muted-foreground); font-size: .72rem; overflow: hidden; text-overflow: ellipsis; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 576,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-cms-list article > div:last-child { display: flex; gap: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 579,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-public-nav { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 580,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-header-start { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 581,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mobile-menu-button { display: inline-grid; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 582,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mobile-nav { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: .2rem .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 583,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mobile-nav a { padding: .65rem; border-radius: .4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 584,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid { grid-template-columns: repeat(2,1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 585,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid article:nth-child(3) { border-left: 1px solid var(--border); border-top: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 586,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid article:nth-child(4) { border-top: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 587,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps { grid-template-columns: repeat(2,1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 588,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps li { border-top: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 589,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps li:nth-child(1), .texise-steps li:nth-child(2) { border-top: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 590,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-card-grid { grid-template-columns: repeat(2,minmax(0,1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 591,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filters { grid-template-columns: 1fr 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 592,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-detail { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 593,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-detail-copy { position: static; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 594,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-grid { grid-template-columns: repeat(2,1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 595,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-brand { grid-column: 1 / -1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 596,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell { grid-template-columns: 10.5rem minmax(0,1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 597,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-metrics { grid-template-columns: repeat(2,minmax(0,1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 598,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-cms { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 602,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-page-container { width: min(calc(100% - 1.25rem), var(--texise-content-width)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 603,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-header-inner { min-height: 3.75rem; gap: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 604,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-public-nav,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 605,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-nav { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 606,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-header-actions { gap: .2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 607,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-brand-logo { width: 2rem; height: 2rem; max-width: 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 608,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-brand-name { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 609,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero { padding-block: 4rem 3.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 610,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero .texise-display { font-size: clamp(3.2rem,17vw,5.6rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 611,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 612,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid article,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 613,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid article:first-child,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 614,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid article:nth-child(3) { min-height: auto; border: 0; border-bottom: 1px solid var(--border); padding: 1.4rem .85rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 615,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid article:last-child { border-bottom: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 616,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-grid h2 { margin-top: 1.2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 617,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 618,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps li,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 619,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps li:first-child,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 620,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps li:nth-child(2) { min-height: auto; display: grid; grid-template-columns: 2rem 1fr; gap: .6rem; align-items: start; padding: 1rem; border: 0; border-bottom: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 621,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-steps li span { margin: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 622,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-card-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 623,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 624,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-settings-grid { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 625,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filters { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 626,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filters > * { width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 627,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-preview { min-height: 18rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 628,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-index, .texise-docs-layout { grid-template-columns: 1fr; gap: 1.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 629,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-sidebar-desktop { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 630,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-mobile-bar { display: block; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 631,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-article { padding-top: .5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 632,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-toc { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 633,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-grid { grid-template-columns: 1fr 1fr; gap: 1.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 634,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-bottom { flex-direction: column; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 635,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-title-row { align-items: start; flex-direction: column; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 636,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-primary-actions { width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 637,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-primary-actions .texise-button,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 638,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-primary-actions .texise-import-menu { flex: 1 1 calc(50% - .5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 639,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-import-menu > summary { width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 640,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-row { grid-template-columns: 2.5rem minmax(0,1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 641,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-row-actions { grid-column: 1 / -1; justify-content: flex-end; border-top: 1px solid var(--border); padding-top: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 642,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell { display: block; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 643,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell > aside { position: static; width: 100%; height: auto; padding: .65rem; border-right: 0; border-bottom: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 644,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell > aside nav { display: flex; overflow-x: auto; margin-top: .65rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 645,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell > aside nav a { white-space: nowrap; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 646,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-top { height: 3rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 647,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell main { padding: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 648,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-metrics { grid-template-columns: repeat(2,minmax(0,1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 649,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-cms-list article { align-items: flex-start; flex-direction: column; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 653,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-page-container { width: min(calc(100% - 1rem), var(--texise-content-width)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 654,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-brand > span:last-child { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 655,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mobile-nav { grid-template-columns: 1fr; margin: .4rem .5rem 0; border: 1px solid var(--border); border-radius: var(--texise-radius-2xl); box-shadow: 0 14px 38px rgb(0 29 56 / .10); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 656,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-actions { align-items: stretch; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 657,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-actions .texise-button { width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 658,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-grid { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 659,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-storage-choice { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 660,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-metrics { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 664,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-site-shell *,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 665,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-shell * { scroll-behavior: auto !important; transition-duration: 0ms !important; animation-duration: 0ms !important; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 669,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-list-controls { display: flex; align-items: center; justify-content: space-between; gap: .75rem; margin: 0 0 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 670,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-search-field { min-width: min(24rem, 100%); display: flex; align-items: center; gap: .45rem; padding-left: .65rem; border: 1px solid var(--border); border-radius: var(--texise-radius-lg); background: var(--card); color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 671,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-search-field:focus-within { border-color: var(--ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 15%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 672,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-search-field input { border: 0; box-shadow: none; background: transparent; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 673,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-list-controls select,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 674,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-actions select { min-height: 2.25rem; border: 1px solid var(--border); border-radius: var(--texise-radius-md); background: var(--card); color: var(--foreground); padding: 0 .55rem; font: inherit; font-size: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 675,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-pager { display: flex; align-items: center; justify-content: flex-end; gap: .7rem; margin-top: 1rem; color: var(--muted-foreground); font-size: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 676,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-support-detail { margin-top: 1rem; display: grid; grid-template-columns: minmax(0,1fr) auto; gap: 1rem; padding: 1.2rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 677,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-support-detail h2 { margin: .2rem 0; font-size: 1.1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 678,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-support-detail p { margin: 0; color: var(--muted-foreground); font-size: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 679,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-support-message { grid-column: 1 / -1; white-space: pre-wrap; padding: 1rem; border-radius: var(--texise-radius-lg); background: var(--secondary); line-height: 1.6; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 680,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-support-detail dl { grid-column: 1 / -1; display: flex; flex-wrap: wrap; gap: 1rem 2rem; margin: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 681,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-support-detail dl div { display: grid; gap: .1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 682,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-support-detail dt { color: var(--muted-foreground); font-size: .7rem; text-transform: uppercase; letter-spacing: .05em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 683,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-support-detail dd { margin: 0; font-size: .82rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 685,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-list-controls { align-items: stretch; flex-direction: column; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 686,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-search-field { min-width: 0; width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 687,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-pager { justify-content: space-between; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 690,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail { margin-top: 1rem; display: grid; gap: 1rem; padding: 1.1rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 691,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail > header { display: flex; justify-content: space-between; gap: 1rem; align-items: flex-start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 692,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail h2 { margin: .2rem 0; font-size: 1.15rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 693,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail header p { margin: 0; color: var(--muted-foreground); font-size: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 694,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail dl { display: grid; grid-template-columns: repeat(auto-fit,minmax(9rem,1fr)); gap: .7rem; margin: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 695,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail dl div { padding: .65rem; border-radius: .55rem; background: var(--muted); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 696,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail dt { color: var(--muted-foreground); font-size: .68rem; text-transform: uppercase; letter-spacing: .05em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 697,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail dd { margin: .15rem 0 0; font-size: .82rem; font-weight: 600; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 698,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail section { display: grid; gap: .45rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 699,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail section h3 { margin: 0; font-size: .88rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 700,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail ul { display: grid; gap: .35rem; margin: 0; padding: 0; list-style: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 701,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail li { display: flex; justify-content: space-between; gap: .75rem; padding: .55rem .65rem; border: 1px solid var(--border); border-radius: .5rem; font-size: .78rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 702,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-user-detail li span { color: var(--muted-foreground); text-align: right; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 703,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cms-preview { display: grid; gap: .55rem; max-height: 24rem; overflow: auto; margin-top: .4rem; padding: .8rem; border: 1px solid var(--border); border-radius: .6rem; background: var(--background); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 704,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cms-preview .texise-prose { font-size: .82rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 707,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-article-meta { margin: .5rem 0 0; color: var(--muted-foreground); font-size: .82rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 708,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-account-cell { display: flex; align-items: center; gap: .55rem; min-width: 13rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 709,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-account-cell > span { min-width: 0; display: grid; gap: .1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 710,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-account-cell strong,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 711,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-account-cell small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 712,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-account-cell small { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 713,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-avatar { width: 1.9rem; height: 1.9rem; border-radius: 999px; object-fit: cover; flex: 0 0 auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 718,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prefix-hero { max-width: 82rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 719,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prefix-hero-inner {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 731,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prefix-hero-eyebrow {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 733,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 737,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prefix-hero-title {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 740,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 747,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prefix-hero-copy {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 751,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 757,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prefix-hero .texise-hero-actions { position: relative; z-index: 3; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 758,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 768,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-2xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 773,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float > svg { flex: 0 0 auto; color: var(--texise-yellow-strong); stroke-width: 3; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 774,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float > span { display: inline-flex; align-items: center; gap: .4rem; font-family: var(--texise-font-display); font-size: 1.12rem; font-weight: 300; white-space: nowrap; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 775,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float > span svg { opacity: .75; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 776,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float-a { left: 2%; top: 8%; transform: rotate(-6deg); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 777,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float-b { right: 7%; top: 5%; transform: rotate(7deg); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 778,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float-c { left: 9%; bottom: 17%; transform: rotate(5deg); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 779,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float-d { right: 4%; bottom: 9%; transform: rotate(-6deg); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 782,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-primary-actions { align-items: center; flex-wrap: nowrap; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 783,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-more-menu { flex: 0 0 auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 784,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-more-menu > summary { width: 2.4rem; min-height: 2.4rem; display: grid; place-items: center; padding: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 785,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-import-popover a,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 786,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-import-popover button { display: flex; align-items: center; gap: .55rem; width: 100%; border: 0; border-radius: .5rem; padding: .6rem .7rem; background: transparent; color: var(--foreground); font: inherit; font-size: .82rem; text-align: left; text-decoration: none; cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 787,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-import-popover a:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 788,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-import-popover button:hover { background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 789,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-row-menu button { width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 790,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-row-menu-action { display: flex; align-items: center; gap: .5rem; width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 791,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-menu-trailing { margin-left: auto; opacity: .55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 794,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-page { max-width: 71.25rem; padding-block: clamp(3rem, 6vw, 5rem) 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 795,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-heading { display: flex; align-items: end; justify-content: space-between; gap: 2rem; margin-bottom: 1.4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 796,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-heading > div:first-child { display: grid; gap: .7rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 797,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-heading h1 { margin: 0; font-family: var(--texise-font-display); font-weight: 300; font-size: clamp(3rem, 6vw, 4.5rem); line-height: .95; letter-spacing: -.04em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 798,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-heading p { margin: 0; color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 799,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-search { position: relative; width: min(18rem, 100%); flex: 0 0 auto; display: flex; align-items: center; gap: .5rem; padding: .35rem .8rem; border: 1px solid var(--border); border-radius: var(--texise-radius-2xl); background: var(--card); box-shadow: 0 8px 22px rgb(0 29 56 / .04); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 800,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-search::before { content: ''; position: absolute; left: 1.4rem; top: -.48rem; width: .85rem; height: .85rem; background: var(--card); border-left: 1px solid var(--border); border-top: 1px solid var(--border); transform: rotate(45deg); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 801,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-search:focus-within { border-color: var(--ring); box-shadow: 0 0 0 3px color-mix(in srgb, var(--ring) 14%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 802,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-search > svg { color: var(--muted-foreground); flex: 0 0 auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 803,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-search input { min-width: 0; width: 100%; border: 0; outline: 0; background: transparent; color: var(--foreground); font: 400 1rem/1.2 var(--texise-font-ui); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 804,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-tags { position: sticky; top: 5.6rem; z-index: 18; display: flex; flex-wrap: wrap; gap: .45rem; margin-bottom: 1.5rem; padding-block: .55rem; background: color-mix(in srgb, var(--background) 94%, transparent); backdrop-filter: blur(14px); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 805,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-tags button { min-height: 2rem; padding: .4rem .82rem; border: 1px solid var(--border); border-radius: 999px; background: var(--secondary); color: var(--foreground); font: 500 .78rem/1 var(--texise-font-ui); cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 806,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-tags button:hover { border-color: color-mix(in srgb, var(--texise-yellow) 70%, var(--border)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 807,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-tags button[data-active='true'] { border-color: var(--texise-yellow); background: var(--texise-yellow); color: var(--texise-navy); font-weight: 600; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 808,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-featured { margin-bottom: 1.35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 809,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-grid { display: grid; grid-template-columns: repeat(3, minmax(0,1fr)); gap: 1.35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 810,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card { display: flex; flex-direction: column; overflow: hidden; min-width: 0; border: 2px solid var(--border); border-radius: var(--texise-radius-3xl); background: var(--card); color: var(--foreground); text-decoration: none; box-shadow: 0 12px 32px rgb(0 29 56 / .055); transition: border-color var(--texise-transition-fast), transform var(--texise-transition-fast), box-shadow var(--texise-transition-fast); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 811,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card:hover { border-color: var(--texise-yellow); transform: translateY(-2px); box-shadow: 0 18px 38px rgb(0 29 56 / .09); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 812,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card-featured { min-height: 30rem; display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 813,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover { position: relative; width: 100%; aspect-ratio: 3 / 2; overflow: hidden; background: var(--texise-yellow); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 814,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-featured { height: 100%; aspect-ratio: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 815,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover img { width: 100%; height: 100%; object-fit: cover; display: block; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 816,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-placeholder { display: grid; place-items: center; color: var(--texise-navy); background: linear-gradient(145deg, var(--texise-yellow), color-mix(in srgb, var(--texise-yellow) 55%, var(--texise-blue))); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 817,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card-body { min-width: 0; display: flex; flex-direction: column; gap: 1rem; padding: 1.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 818,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card-featured .texise-blog-card-body { padding: clamp(2rem, 4vw, 4rem); justify-content: space-between; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 819,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card-meta { display: flex; align-items: center; flex-wrap: wrap; gap: .5rem; color: var(--muted-foreground); font-size: .72rem; font-weight: 500; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 820,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-mini-tags { display: inline-flex; flex-wrap: wrap; gap: .3rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 821,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-mini-tags span { padding: .25rem .55rem; border: 1px solid var(--border); border-radius: 999px; background: var(--secondary); color: var(--foreground); font-size: .65rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 822,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card-copy { display: grid; gap: .6rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 823,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card-copy h2 { margin: 0; font-family: var(--texise-font-display); font-size: clamp(1.45rem, 2vw, 2rem); line-height: 1.05; font-weight: 300; letter-spacing: -.025em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 824,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card-featured .texise-blog-card-copy h2 { font-size: clamp(2rem, 3.7vw, 3.4rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 825,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card-copy p { margin: 0; color: var(--muted-foreground); line-height: 1.55; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 4; overflow: hidden; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 826,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-author { display: flex; align-items: center; gap: .55rem; margin-top: auto; font-family: var(--texise-font-display); font-size: .88rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 827,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-author-avatar { width: 2rem; height: 2rem; display: grid; place-items: center; border-radius: 999px; background: var(--secondary); font-family: var(--texise-font-ui); font-weight: 600; font-size: .72rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 828,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card-featured .texise-blog-author-avatar { width: 2.75rem; height: 2.75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 829,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-pagination { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin-top: 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 830,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-pagination button { border: 1px solid var(--border); border-radius: var(--texise-radius-xl); padding: .55rem .8rem; background: var(--card); color: var(--foreground); font: inherit; cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 831,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-pagination button:disabled { opacity: .4; cursor: default; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 832,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-pagination span { color: var(--muted-foreground); font-size: .78rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 834,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article { max-width: 62rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 835,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article > header { display: grid; gap: .9rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 836,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-deck { max-width: 48rem; margin: 0; color: var(--muted-foreground); font-size: 1.15rem; line-height: 1.55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 837,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-cover { width: 100%; max-height: 34rem; object-fit: cover; margin-top: 1rem; border-radius: var(--texise-radius-3xl); border: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 838,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prose img { display: block; max-width: 100%; height: auto; margin: 1.5rem auto; border-radius: var(--texise-radius-xl); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 841,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-blog-cms { grid-template-columns: minmax(0, 1.6fr) minmax(18rem, .6fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 842,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: .7rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 843,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-form-grid > div { display: grid; gap: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 844,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-form-wide { grid-column: 1 / -1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 845,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-admin { display: grid; gap: .65rem; margin-block: .35rem; padding: .85rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 846,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-admin-head { display: flex; justify-content: space-between; align-items: start; gap: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 847,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-admin-head h3 { margin: 0; font-size: .9rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 848,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-admin-head p { margin: .2rem 0 0; color: var(--muted-foreground); font-size: .75rem; line-height: 1.45; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 849,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-admin-head input[type='file'] { position: absolute; width: 1px; height: 1px; opacity: 0; pointer-events: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 850,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-admin-preview { position: relative; overflow: hidden; border-radius: var(--texise-radius-lg); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 851,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-admin-preview img { display: block; width: 100%; max-height: 18rem; object-fit: cover; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 852,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-admin-preview button { position: absolute; right: .5rem; top: .5rem; background: color-mix(in srgb, var(--card) 90%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 853,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-publish-row { display: flex; align-items: end; justify-content: space-between; gap: 1rem; margin-top: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 854,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-publish-row > div:first-child { min-width: 10rem; display: grid; gap: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 855,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor { min-width: 0; border-radius: var(--texise-radius-xl); overflow: hidden; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 856,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor .toastui-editor-defaultUI { border-color: var(--border); border-radius: var(--texise-radius-xl); overflow: hidden; font-family: var(--texise-font-ui); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 857,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor .toastui-editor-toolbar,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 858,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor .toastui-editor-mode-switch { background: var(--secondary); border-color: var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 859,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor .toastui-editor-md-container,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 860,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor .toastui-editor-ww-container,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 861,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor .toastui-editor-md-preview { background: var(--card); color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 862,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor .toastui-editor-contents,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 863,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor .ProseMirror { font-family: var(--texise-font-ui); color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 864,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor .toastui-editor-contents :is(h1,h2,h3,h4),"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 865,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor .ProseMirror :is(h1,h2,h3,h4) { font-family: var(--texise-font-display); font-weight: 400; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 866,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor code,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 867,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor pre,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 868,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-toast-editor .toastui-editor-md-container { font-family: var(--texise-font-mono); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 869,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-cms-list article > img { width: 4.5rem; height: 3.1rem; object-fit: cover; border-radius: .45rem; flex: 0 0 auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 872,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prefix-hero-inner { min-height: 31rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 873,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float-a { left: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 874,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float-b { right: 1%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 875,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float-c { left: 3%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 876,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float-d { right: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 877,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-grid { grid-template-columns: repeat(2, minmax(0,1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 878,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-blog-cms { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 879,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-layout { grid-template-columns: minmax(12rem,14rem) minmax(0,1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 880,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-toc { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 885,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-index,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 886,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-layout { grid-template-columns: minmax(0, 1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 887,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-article,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 888,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-results { width: 100%; max-width: none; min-width: 0; padding-inline: .25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 889,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-docs-layout { gap: 1rem; padding-top: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 891,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prefix-hero-inner { min-height: auto; align-items: stretch; padding: 2.4rem .15rem; text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 892,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prefix-hero-title,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 893,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prefix-hero-copy { margin-inline: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 894,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float { position: relative; inset: auto; z-index: 0; margin-top: .65rem; transform: none; align-self: flex-start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 895,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float-b,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 896,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-float-d { align-self: flex-end; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 897,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-prefix-hero .texise-hero-actions { order: 10; margin-top: 1.2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 898,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-heading { align-items: stretch; flex-direction: column; gap: 1.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 899,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-search { width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 900,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-tags { top: 4.7rem; flex-wrap: nowrap; overflow-x: auto; scrollbar-width: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 901,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-tags::-webkit-scrollbar { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 902,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-tags button { flex: 0 0 auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 903,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card-featured { min-height: auto; grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 904,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-featured { aspect-ratio: 3 / 2; height: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 905,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-card-featured .texise-blog-card-body { padding: 1.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 906,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-grid { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 907,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-form-grid { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 908,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-form-wide { grid-column: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 909,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-cover-admin-head,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 910,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-publish-row { align-items: stretch; flex-direction: column; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 911,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-primary-actions { width: auto; align-self: flex-start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 912,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-primary-actions .texise-button,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 913,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-primary-actions .texise-import-menu { flex: 0 0 auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 917,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-detail-page {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 922,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-shell {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 926,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-3xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 931,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-hero {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 936,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 938,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-hero > img {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 947,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-hero-placeholder {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 950,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color: var(--texise-navy);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 951,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: linear-gradient(145deg, var(--texise-yellow), color-mix(in srgb, var(--texise-yellow) 58%, var(--texise-blue)));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 953,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-header {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 958,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-written {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 960,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 964,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-header > h1 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 967,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 974,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-tags {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 979,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-tags a {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 989,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 993,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "transition: border-color var(--texise-transition-fast), background var(--texise-transition-fast);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 995,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-tags a:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 996,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-color: var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 997,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 18%, var(--secondary));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 999,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-author {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1005,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-author > :is(img, span) {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1011,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-author > img { object-fit: cover; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1012,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-author > span {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1016,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1019,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-author > strong {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1020,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1024,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-content {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1030,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1035,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1039,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose :is(h1, h2, h3, h4) {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1041,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1046,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose h1 { font-size: clamp(2rem, 4vw, 2.5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1047,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose h2 { margin-top: 2.6rem; font-size: clamp(1.6rem, 3.2vw, 2.5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1048,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose h3 { margin-top: 2rem; font-size: clamp(1.3rem, 2.3vw, 1.8rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1049,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose p { margin: 1rem 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1050,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose :is(ul, ol) { margin-block: 1rem; padding-inline-start: 1.65rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1051,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose ul { list-style-type: disc; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1052,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose ol { list-style-type: decimal; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1053,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose ul ul { list-style-type: circle; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1054,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose ul ul ul { list-style-type: square; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1055,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose li { display: list-item; margin-block: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1056,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose li::marker { color: color-mix(in srgb, var(--foreground) 82%, var(--texise-yellow-strong)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1057,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose a {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1058,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color: var(--texise-blue);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1063,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose a:hover { text-decoration-thickness: .13em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1064,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose strong { font-family: var(--texise-font-ui); font-weight: 650; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1065,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose :not(pre) > code {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1070,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1075,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose pre {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1082,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-lg);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1085,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1090,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose pre code { padding: 0; background: transparent; color: inherit; font: inherit; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1091,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose img {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1097,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1099,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose table {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1105,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1108,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose :is(th, td) { min-width: 7rem; padding: .6rem .75rem; border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1109,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose th { font-weight: 650; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1110,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose blockquote {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1113,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-left: .22rem solid var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1114,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: 0 var(--texise-radius-lg) var(--texise-radius-lg) 0;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1117,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-content .texise-prev-next { max-width: 68rem; margin: clamp(2.5rem, 5vw, 4rem) auto 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1118,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-author-avatar:is(img) { object-fit: cover; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1121,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-detail-page { padding-top: 1.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1122,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-shell { border-radius: var(--texise-radius-2xl); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-hero { aspect-ratio: 2 / 1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1124,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-header { padding-top: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1125,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-content { padding-bottom: 1.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1126,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-prose > :where(p, ul, ol, blockquote, h1, h2, h3, h4) { max-width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1127,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-article-content .texise-prev-next { flex-direction: column; align-items: stretch; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1131,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1138,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-copy h1 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1141,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1147,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-copy > p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1154,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-chip-row { display: flex; flex-wrap: wrap; gap: .45rem; margin-top: 1.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1155,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-chip-row span,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1156,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tag-row span {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1165,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workspace-mock {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1169,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-2xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1173,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-toolbar { display: flex; align-items: center; gap: .4rem; min-height: 2.55rem; padding: .6rem .8rem; border-bottom: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1174,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-toolbar > span { width: .55rem; height: .55rem; border-radius: 999px; background: var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1175,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-toolbar > strong { margin-left: .35rem; font-size: .73rem; color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1176,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid { display: grid; grid-template-columns: minmax(8rem, .65fr) minmax(14rem, 1.55fr) minmax(10rem, 1fr); min-height: 24rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1177,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid > * { min-width: 0; padding: 1.25rem; border-right: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1178,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid > *:last-child { border-right: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1179,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid aside { display: flex; flex-direction: column; gap: .7rem; background: color-mix(in srgb, var(--secondary) 56%, transparent); font-size: .78rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1180,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid aside span { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1181,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid > div { display: flex; flex-direction: column; gap: 1rem; justify-content: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1182,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid small { color: var(--texise-blue); font-weight: 700; letter-spacing: .08em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1183,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid h2 { margin: 0; font-family: var(--texise-font-display); font-size: clamp(1.6rem, 2.5vw, 2.5rem); font-weight: 300; line-height: 1.05; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1184,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1185,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid span { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1186,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid code { overflow-wrap: anywhere; color: var(--foreground); font-family: var(--texise-font-mono); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1188,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-section { padding-block: clamp(3.5rem, 7vw, 6.5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1189,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-section .texise-section-heading > h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1190,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-split h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1191,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-pricing h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1192,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-final-cta h2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1194,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1200,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-section .texise-section-heading > p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1201,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-split p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1202,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-pricing p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1203,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-final-cta p { color: var(--muted-foreground); line-height: 1.65; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1204,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-four,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1205,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-three,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1206,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-audience-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1207,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-capability-grid {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1212,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-four { grid-template-columns: repeat(4, minmax(0, 1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1213,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-three { grid-template-columns: repeat(3, minmax(0, 1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1214,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-audience-grid { grid-template-columns: repeat(5, minmax(0, 1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1215,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-capability-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1216,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-four > article,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1217,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-three > :is(article,a),"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1218,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-audience-grid > article,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1219,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-capability-grid > div {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1223,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1228,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-four > article > span { display: block; margin-bottom: 2.25rem; color: var(--texise-blue); font-size: .72rem; font-weight: 800; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1229,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-four h3,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1230,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-three h3,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1231,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-audience-grid h3 { margin: 0 0 .55rem; font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1232,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-four p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1233,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-three p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1234,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-audience-grid p { margin: 0; color: var(--muted-foreground); font-size: .88rem; line-height: 1.58; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1235,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-three > a { transition: transform var(--texise-transition-fast), border-color var(--texise-transition-fast); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1236,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-three > a:hover { transform: translateY(-2px); border-color: color-mix(in srgb, var(--texise-blue) 45%, var(--border)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1237,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-three > a > span { color: var(--muted-foreground); font-size: .82rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1238,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-capability-grid > div { display: flex; align-items: center; gap: .65rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1239,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-capability-grid svg { flex: none; color: var(--texise-blue); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1241,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-split {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1248,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-stack { display: grid; gap: .65rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1249,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-stack > div { display: flex; align-items: center; gap: .7rem; min-height: 3rem; padding: .75rem .9rem; border: 1px solid var(--border); border-radius: var(--texise-radius-lg); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1250,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-stack svg { flex: none; color: var(--texise-blue); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1251,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-terminal pre { min-width: 0; overflow-x: auto; margin: 0; padding: 1.3rem; border: 1px solid color-mix(in srgb, var(--border) 70%, transparent); border-radius: var(--texise-radius-xl); background: var(--texise-navy); color: #f7f8fb; box-shadow: 0 22px 60px rgb(0 29 56 / .16); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1252,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-terminal code { font-family: var(--texise-font-mono); font-size: .88rem; line-height: 1.85; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1253,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-number-flow { display: flex; flex-wrap: wrap; gap: .6rem; margin-top: 1.2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1254,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-number-flow span { display: inline-flex; align-items: center; gap: .45rem; padding: .45rem .65rem; border: 1px solid var(--border); border-radius: 999px; font-size: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1255,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-number-flow b { color: var(--texise-blue); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1256,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-local-flow { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 1rem; margin-top: 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1257,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-local-flow > div { min-height: 7rem; padding: 1.15rem; border-top: 2px solid var(--texise-yellow); background: color-mix(in srgb, var(--secondary) 55%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1258,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-local-flow span { display: block; margin-bottom: 1.4rem; color: var(--muted-foreground); font-size: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1260,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-table-scroll { width: 100%; max-width: 100%; overflow-x: auto; margin-top: 2rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1261,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-table,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1262,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-matrix { width: 100%; min-width: 52rem; border-collapse: collapse; font-size: .86rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1263,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-table :is(th,td),"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1264,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-matrix :is(th,td) { padding: .9rem 1rem; border-bottom: 1px solid var(--border); text-align: left; vertical-align: top; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1265,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-table thead th,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1266,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-matrix thead th { position: sticky; top: 0; background: var(--card); color: var(--foreground); font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1267,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-table tbody th,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1268,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-matrix tbody th { color: var(--foreground); font-weight: 650; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1269,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-table td,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1270,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-matrix td { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1271,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-matrix-group th { padding-top: 1.15rem; background: color-mix(in srgb, var(--secondary) 70%, var(--card)); color: var(--foreground); text-transform: uppercase; letter-spacing: .07em; font-size: .7rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1273,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-pricing,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1274,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-plans {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1279,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-pricing { grid-template-columns: minmax(0, 1.55fr) minmax(10rem, .6fr) minmax(10rem, .6fr) auto; align-items: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1280,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-pricing > div:not(:first-child) { display: grid; gap: .25rem; min-height: 7rem; align-content: center; padding: 1rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1281,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-pricing > div:not(:first-child) span { color: var(--muted-foreground); font-size: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1282,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-plans { grid-template-columns: repeat(2, minmax(0, 1fr)); max-width: 64rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1283,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-plans > article { display: flex; flex-direction: column; align-items: flex-start; min-height: 25rem; padding: clamp(1.4rem, 3vw, 2rem); border: 1px solid var(--border); border-radius: var(--texise-radius-2xl); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1284,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-plans > article > h2 { margin: 0; font-family: var(--texise-font-display); font-size: clamp(2.2rem, 4vw, 3.8rem); font-weight: 300; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1285,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-plans > article > p { color: var(--muted-foreground); line-height: 1.6; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1286,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-plans .texise-button { margin-top: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1287,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-price { display: block; margin: 1.25rem 0; font-size: clamp(1.5rem, 3vw, 2.2rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1288,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-plans .texise-pricing-featured { border-color: color-mix(in srgb, var(--texise-yellow) 70%, var(--border)); box-shadow: 0 22px 64px rgb(0 29 56 / .10); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1290,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list { display: grid; gap: .7rem; max-width: 58rem; margin-top: 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1291,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list details { border: 1px solid var(--border); border-radius: var(--texise-radius-lg); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1292,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list summary { padding: 1rem 1.1rem; cursor: pointer; font-weight: 650; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1293,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list details[open] summary { border-bottom: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1294,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list p { margin: 0; padding: 1rem 1.1rem 1.2rem; color: var(--muted-foreground); line-height: 1.65; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1295,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-final-cta { margin-block: clamp(3rem, 7vw, 6rem); padding: clamp(2rem, 5vw, 4.2rem); border: 1px solid color-mix(in srgb, var(--texise-yellow) 55%, var(--border)); border-radius: var(--texise-radius-2xl); background: linear-gradient(135deg, color-mix(in srgb, var(--texise-yellow) 14%, var(--card)), var(--card)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1298,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1299,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-copy h1 { max-width: 14ch; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1300,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-four { grid-template-columns: repeat(2, minmax(0, 1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1301,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-audience-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1302,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-pricing { grid-template-columns: 1fr 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1303,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-pricing > div:first-child { grid-column: 1 / -1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1307,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero { padding-top: 3.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1308,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-copy h1 { font-size: clamp(2.7rem, 13vw, 4.5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1309,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1310,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid > * { border-right: 0; border-bottom: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1311,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-mock-grid > *:last-child { border-bottom: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1312,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-four,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1313,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-three,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1314,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-audience-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1315,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-capability-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1316,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-local-flow,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1317,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-split,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1318,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-plans { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1319,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-pricing { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1320,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-pricing > div:first-child { grid-column: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1321,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-split { gap: 1.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1322,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-terminal pre { font-size: .78rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1323,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-plans > article { min-height: 20rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1327,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-heading { padding-bottom: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1328,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-progress { position: relative; max-width: 32rem; height: .55rem; margin-top: 1.4rem; overflow: visible; border-radius: 999px; background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1329,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-progress > span { display: block; height: 100%; border-radius: inherit; background: var(--texise-blue); transition: width var(--texise-transition-fast); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1330,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-progress > small { display: block; margin-top: .45rem; color: var(--muted-foreground); font-size: .74rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1331,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem; padding-block: 2.5rem 5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1332,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-card { position: relative; display: flex; min-height: 18rem; flex-direction: column; gap: .8rem; padding: 1.35rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); color: var(--card-foreground); text-decoration: none; transition: transform var(--texise-transition-fast), border-color var(--texise-transition-fast); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1333,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-card:hover { transform: translateY(-2px); border-color: color-mix(in srgb, var(--texise-blue) 45%, var(--border)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1334,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-card h2 { margin: .2rem 0 0; font-size: 1.15rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1335,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-card p { margin: 0; color: var(--muted-foreground); line-height: 1.6; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1336,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-card .texise-text-link { margin-top: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1337,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-number { color: var(--texise-blue); font-size: .72rem; font-weight: 800; letter-spacing: .08em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1338,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-done { display: inline-flex; align-items: center; gap: .25rem; color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1339,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-article { max-width: 58rem; padding-block: 3rem 6rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1340,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-article > header { margin-top: 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1341,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-article > header > p { max-width: 48rem; color: var(--muted-foreground); font-size: 1.05rem; line-height: 1.7; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1342,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-outcomes { display: flex; gap: 1rem; margin: 2rem 0 2.5rem; padding: 1.15rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: color-mix(in srgb, var(--secondary) 65%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1343,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-outcomes > svg { flex: none; margin-top: .15rem; color: var(--texise-blue); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1344,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-outcomes ul { margin: .6rem 0 0; padding-left: 1.2rem; color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1345,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-outcomes li + li { margin-top: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1346,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-content { display: grid; gap: 2.2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1347,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-content section { scroll-margin-top: 5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1348,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-content h2 { margin: 0 0 .8rem; font-size: 1.35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1349,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-content p { color: var(--muted-foreground); line-height: 1.75; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1350,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-code { margin: 1rem 0; overflow-x: auto; padding: 1rem; border: 1px solid color-mix(in srgb, var(--border) 70%, transparent); border-radius: var(--texise-radius-lg); background: var(--texise-navy); color: #f7f8fb; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1351,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-code code { font-family: var(--texise-font-mono); font-size: .84rem; line-height: 1.65; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1352,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-complete { display: flex; flex-wrap: wrap; align-items: center; gap: 1rem; margin-top: 3rem; padding-top: 1.5rem; border-top: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1353,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-complete > span { color: var(--muted-foreground); font-size: .82rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@media (max-width: 1000px) { .texise-learn-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1355,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@media (max-width: 640px) { .texise-learn-grid { grid-template-columns: 1fr; } .texise-learn-card { min-height: 14rem; } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1359,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-join-loader {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1369,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-join-loader-card {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1382,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-join-loader-card h2 { margin: 0; font-size: 1.05rem; font-weight: 650; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1383,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-join-loader-card p { margin: 0; color: var(--muted-foreground); font-size: .9rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1384,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-join-loader-card small { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1385,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-join-spinner { animation: texise-project-join-spin .9s linear infinite; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1386,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-join-progress {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1393,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-join-progress > span {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1400,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@keyframes texise-project-join-spin { to { transform: rotate(360deg); } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1403,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-projects-page--empty { min-height: 25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1404,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-project-list--empty { min-height: 23rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1405,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-projects-empty-state { min-height: 21rem; padding-block-start: 3rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1406,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-projects-empty-state .texise-projects-empty-copy { margin-bottom: 1.1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1410,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-socials {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1416,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-social-link {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1428,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-social-link:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1433,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-footer-social-link:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1435,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-button:focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1456,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-body);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1470,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-notice {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1486,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-notice p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1491,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-notice a {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1496,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-actions {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1501,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1514,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-button-primary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1519,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-button-primary:hover { opacity: .88; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1520,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-button-secondary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1524,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-button-secondary:hover { border-color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1527,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-notice {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1535,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-actions { flex-direction: column; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1536,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-cookie-button { width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1549,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-v2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1557,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "linear-gradient(180deg, color-mix(in srgb, var(--texise-yellow) 4%, var(--background)) 0%, var(--background) 25%, var(--background) 100%);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1559,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-grid {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1571,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-formulas {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1585,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-formulas .texise-home-formula-accent { fill: var(--texise-yellow); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1586,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-inner {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1595,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-eyebrow {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1598,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-body);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1605,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "animation: texise-home-fade-up .52s cubic-bezier(.2,.7,.2,1) both;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1607,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-title {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1614,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1620,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "animation: texise-home-fade-up .62s .03s cubic-bezier(.2,.7,.2,1) both;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1622,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-title > span { display: block; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1623,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-privacy { position: relative; width: fit-content; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1624,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-privacy > svg {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1632,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color: var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1634,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-privacy > svg path {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1641,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-actions {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1648,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "animation: texise-home-fade-up .65s .06s cubic-bezier(.2,.7,.2,1) both;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1650,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-action {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1658,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-buy {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1662,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-buy:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1664,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 8%, var(--background));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1666,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-buy.is-disabled { pointer-events: none; opacity: .58; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1668,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-wrap {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1672,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "animation: texise-home-fade-up .7s .08s cubic-bezier(.2,.7,.2,1) both;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1674,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-wrap::before {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1680,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 23%, transparent);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1684,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1690,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-body);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1693,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1696,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-titlebar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1707,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-title,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1708,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-title-actions,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1709,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tabs,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1710,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tools,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1711,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-bottom-actions,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1712,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-bottom > div,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1713,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-header > div {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1717,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-title { min-width: 0; gap: .5rem; font-weight: 650; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1718,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-favicon { width: 1.25rem; height: 1.25rem; flex: 0 0 auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1719,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-saved { color: var(--muted-foreground); font-size: .62rem; font-weight: 500; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1720,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-title-actions { gap: .35rem; color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1721,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-static-action,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1722,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-compile {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1733,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button.texise-hero-workspace-compile {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1735,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-color: color-mix(in srgb, var(--texise-yellow) 72%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1737,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 68%, var(--background));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1741,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button.texise-hero-workspace-compile:hover:not(:disabled) { transform: translateY(-1px); box-shadow: 0 4px 12px color-mix(in srgb, var(--texise-yellow) 25%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1742,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button.texise-hero-workspace-compile:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1743,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tabs > button:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1744,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-trigger:focus-visible,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1745,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-close:focus-visible { outline: 2px solid var(--texise-yellow); outline-offset: 2px; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1746,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button.texise-hero-workspace-compile:disabled { cursor: wait; opacity: .82; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1747,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button.texise-hero-workspace-compile.is-compiled { background: color-mix(in srgb, #43a66b 20%, var(--background)); border-color: color-mix(in srgb, #43a66b 70%, var(--border)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1748,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-play { font-size: .58rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1749,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-toolbar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1758,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tabs { gap: .12rem; padding-inline: .45rem; border-right: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1759,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tabs > button,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1760,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tabs > span,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1761,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tools > span {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1769,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tabs > button { cursor: pointer; transition: background .15s ease, color .15s ease; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1770,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tabs > button:hover { color: var(--foreground); background: color-mix(in srgb, var(--background) 72%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1771,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tabs .is-active {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1777,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tools { justify-content: flex-end; gap: .05rem; padding-inline: .35rem; overflow: hidden; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1778,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-pdf-label { display: flex; align-items: center; padding-inline: .7rem; border-left: 1px solid var(--border); color: var(--foreground); font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1779,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-grid {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1786,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-files {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1795,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-pane-heading { margin: 0 .38rem .5rem; color: var(--muted-foreground); font-size: .56rem; font-weight: 800; letter-spacing: .09em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1796,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-file { display: flex; align-items: center; gap: .28rem; min-height: 1.65rem; padding: .28rem .38rem; border-radius: .34rem; color: var(--muted-foreground); white-space: nowrap; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1797,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-file.is-active { color: var(--foreground); background: color-mix(in srgb, var(--texise-yellow) 14%, var(--secondary)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1798,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-file.is-active strong { font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1799,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-files-spacer { flex: 1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1800,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-file-status { display: flex; align-items: center; gap: .3rem; padding: .3rem .38rem; color: var(--muted-foreground); font-size: .56rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1801,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-status-dot { width: .42rem; height: .42rem; flex: 0 0 auto; border-radius: 999px; background: #43a66b; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1802,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-status-dot.is-yellow { background: var(--texise-yellow); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1803,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-source {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1812,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-source.is-terminal-open { grid-template-rows: minmax(0, 1fr) 10rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1813,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-editor-compare {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1821,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-editor-layer {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1828,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-editor-layer-visual { z-index: 1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1829,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-editor-layer-source {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1835,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-label {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1848,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-body);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1857,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-label.is-source { left: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1858,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-label.is-visual { right: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1859,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-divider {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1866,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1867,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "box-shadow: 0 0 12px color-mix(in srgb, var(--texise-yellow) 48%, transparent);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1871,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-handle {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1883,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 2px solid var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1887,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "box-shadow: 0 0 0 .25rem color-mix(in srgb, var(--texise-yellow) 10%, transparent), 0 6px 18px rgb(0 0 0 / .16);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1893,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-handle::before {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1899,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-handle > span {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1903,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 72%, var(--foreground));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1905,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-handle:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1906,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-handle.is-dragging,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1907,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-handle:focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1909,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "box-shadow: 0 0 0 .34rem color-mix(in srgb, var(--texise-yellow) 16%, transparent), 0 8px 24px rgb(0 0 0 / .2);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1911,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-handle:focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1915,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-source-preview,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1916,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-preview { height: 100%; min-height: 0; display: grid; grid-template-rows: 1.85rem minmax(0,1fr) 1.55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1917,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-source-preview { background: var(--background); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1918,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-editor-tabs { display: flex; align-items: center; gap: .5rem; padding-inline: .68rem; border-bottom: 1px solid var(--border); color: var(--muted-foreground); font-size: .61rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1919,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-editor-tabs .is-active { color: var(--foreground); font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1920,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-code {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1926,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1930,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-line-numbers,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1931,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-code-content { display: grid; grid-auto-rows: 1.43em; align-content: start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1932,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-line-numbers { color: color-mix(in srgb, var(--muted-foreground) 58%, transparent); text-align: right; padding-right: .65rem; user-select: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1933,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-code-content { min-width: 0; overflow: hidden; color: var(--foreground); padding-right: .72rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1934,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-code-content > div { overflow: hidden; white-space: nowrap; text-overflow: clip; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1935,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-code-content .is-highlighted { margin-inline: -.25rem; padding-inline: .25rem; border-radius: .25rem; background: color-mix(in srgb, var(--texise-yellow) 13%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1936,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-code-command { color: #a05a00; font-weight: 650; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1937,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-code-dim { color: color-mix(in srgb, var(--foreground) 55%, var(--muted-foreground)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1938,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-code-comment { color: color-mix(in srgb, var(--muted-foreground) 78%, #56856f); font-style: italic; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1939,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-code-equation { color: #7656a7; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1940,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-code-empty { opacity: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1941,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-source-status { display: flex; align-items: center; justify-content: flex-end; gap: .65rem; padding-inline: .62rem; border-top: 1px solid var(--border); color: var(--muted-foreground); font-size: .52rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1942,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-document {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1950,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-title { text-align: center; font-size: 1rem; font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1951,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-author { margin: .24rem 0 1rem; text-align: center; color: var(--muted-foreground); font-size: .66rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1952,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-block { position: relative; margin: 0 0 .82rem; padding: .25rem .42rem; border: 1px solid transparent; border-radius: .4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1953,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-block.is-hovered { border-color: color-mix(in srgb, var(--texise-yellow) 48%, var(--border)); background: color-mix(in srgb, var(--texise-yellow) 6%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1954,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-handle { position: absolute; left: -.65rem; top: .32rem; color: var(--muted-foreground); font-family: var(--texise-font-body); font-size: .62rem; letter-spacing: -.18em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1955,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-heading { margin-bottom: .28rem; font-size: .72rem; font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1956,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-document p { margin: 0; font-size: .62rem; line-height: 1.55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1957,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-equation { margin: .65rem auto .2rem; text-align: center; font-size: .88rem; font-style: italic; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1958,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-citation { color: #8b6914; font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1959,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-pdf { min-width: 0; display: grid; grid-template-rows: 1.85rem minmax(0, 1fr); background: color-mix(in srgb, var(--secondary) 77%, #bfc2c8); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1960,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-pdf-toolbar { display: flex; align-items: center; justify-content: flex-end; gap: .58rem; padding-inline: .68rem; border-bottom: 1px solid color-mix(in srgb, var(--border) 85%, transparent); background: color-mix(in srgb, var(--card) 92%, var(--secondary)); color: var(--muted-foreground); font-size: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1961,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-pdf-canvas { position: relative; min-height: 0; display: grid; place-items: center; overflow: hidden; padding: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1962,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-pdf-page {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1972,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "animation: texise-pdf-fade-in .32s ease both;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1974,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-paper-title { text-align: center; font-size: .9rem; font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1975,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-paper-author { margin-top: .25rem; text-align: center; color: #666; font-size: .52rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1976,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-paper-rule { width: 30%; height: 1px; margin: .6rem auto .72rem; background: #d7d7d7; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1977,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-paper-heading { margin: .55rem 0 .26rem; font-size: .62rem; font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1978,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-pdf-page p { margin: 0; font-size: .49rem; line-height: 1.45; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1979,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-paper-equation { margin: .62rem 0; text-align: center; font-size: .76rem; font-style: italic; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1980,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-paper-compiled { position: absolute; top: .45rem; right: .5rem; padding: .16rem .28rem; border-radius: .25rem; background: #eef8f1; color: #267745; font-family: var(--texise-font-body); font-size: .42rem; font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1981,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-paper-page-number { position: absolute; bottom: .45rem; left: 0; right: 0; text-align: center; color: #777; font-size: .45rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1982,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-pdf.is-compiling .texise-hero-pdf-canvas { background: color-mix(in srgb, var(--secondary) 90%, #bfc2c8); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1983,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-compile-loader { display: grid; justify-items: center; gap: .45rem; color: color-mix(in srgb, var(--foreground) 72%, var(--muted-foreground)); font-size: .65rem; text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1984,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-compile-loader > span:last-child { color: var(--muted-foreground); font-size: .52rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1985,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-spinner { display: inline-block; width: 1.45rem; height: 1.45rem; border: 2px solid color-mix(in srgb, var(--muted-foreground) 26%, transparent); border-top-color: var(--texise-yellow); border-radius: 999px; animation: texise-hero-spin .75s linear infinite; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1986,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-spinner.is-small { width: .72rem; height: .72rem; border-width: 1.5px; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1987,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1994,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1995,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "animation: texise-terminal-rise .2s ease both;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1997,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-header { display: flex; align-items: center; justify-content: space-between; padding-inline: .72rem; border-bottom: 1px solid rgba(255,255,255,.1); background: #17191d; font-family: var(--texise-font-body); font-size: .56rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1998,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-header > div { gap: .45rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 1999,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-header strong { font-size: .58rem; letter-spacing: .06em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2000,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-header > div > span:last-child { color: #999fa8; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2001,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-icon { color: #f4ca28; font-family: var(--texise-font-mono); font-weight: 800; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2002,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-close { width: 1.45rem; height: 1.45rem; border: 0; border-radius: .28rem; background: transparent; color: #b6bac2; cursor: pointer; font-size: .88rem; line-height: 1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2003,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-close:hover { background: rgba(255,255,255,.08); color: #fff; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2004,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-body { overflow: hidden; padding: .65rem .8rem; font-size: .58rem; line-height: 1.5; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2005,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-terminal-prompt { color: #f4ca28; font-weight: 800; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2006,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-terminal-muted { color: #999fa8; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2007,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-terminal-success { color: #7dd99c; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2008,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-terminal-caret { display: inline-block; width: .42rem; height: .78em; margin-left: .15rem; vertical-align: -.05em; background: #f2f2f2; animation: texise-terminal-caret 1s steps(1) infinite; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2009,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-bottom { min-height: 2rem; display: flex; align-items: center; justify-content: space-between; gap: .8rem; padding-inline: .62rem; border-top: 1px solid var(--border); background: color-mix(in srgb, var(--card) 93%, var(--secondary)); color: var(--muted-foreground); font-size: .56rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2010,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-bottom > div { gap: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2011,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-bottom-actions { gap: .12rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2012,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-bottom-actions > span,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2013,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-trigger { padding: .28rem .44rem; border-radius: .34rem; color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2014,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-trigger {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2018,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 1px solid color-mix(in srgb, var(--texise-yellow) 72%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2019,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 18%, var(--background));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2022,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "box-shadow: 0 0 0 1px color-mix(in srgb, var(--texise-yellow) 8%, transparent), 0 2px 8px color-mix(in srgb, var(--texise-yellow) 18%, transparent);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2023,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "animation: texise-terminal-invite 1.4s .85s ease-out 1 both;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2025,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-trigger:hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2026,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-trigger[aria-pressed='true'] { background: color-mix(in srgb, var(--texise-yellow) 34%, var(--background)); border-color: var(--texise-yellow); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2027,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-description {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2036,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "animation: texise-home-fade-up .65s .14s cubic-bezier(.2,.7,.2,1) both;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2038,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-capabilities {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2048,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "animation: texise-home-fade-up .65s .2s cubic-bezier(.2,.7,.2,1) both;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2050,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-capabilities > span { display: inline-flex; align-items: center; gap: .43rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2051,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-capability-check { width: 1.12rem; height: 1.12rem; display: inline-flex; color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2052,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-capability-check svg { width: 100%; height: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2053,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-capability-check circle { fill: var(--texise-yellow); stroke: color-mix(in srgb, var(--texise-yellow) 78%, var(--foreground)); stroke-width: 1.1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2054,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-capability-check path { fill: none; stroke: currentColor; stroke-width: 1.8; stroke-linecap: round; stroke-linejoin: round; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2056,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@keyframes texise-home-fade-up { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2057,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@keyframes texise-hero-spin { to { transform: rotate(360deg); } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2058,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@keyframes texise-pdf-fade-in { from { opacity: .22; transform: translateY(3px); } to { opacity: 1; transform: translateY(0); } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2059,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@keyframes texise-terminal-rise { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2060,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@keyframes texise-terminal-caret { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2061,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@keyframes texise-terminal-invite { 0% { box-shadow: 0 0 0 0 color-mix(in srgb, var(--texise-yellow) 36%, transparent); } 55% { box-shadow: 0 0 0 .38rem transparent, 0 3px 12px color-mix(in srgb, var(--texise-yellow) 24%, transparent); } 100% { box-shadow: 0 2px 8px color-mix(in srgb, var(--texise-yellow) 18%, transparent); } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2064,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-pdf-page { width: min(94%, 15rem); border-radius: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2068,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-eyebrow { margin-bottom: 1.5rem; font-size: .9rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2069,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-title { font-size: 2.5rem; line-height: 1.2; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2070,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-wrap { margin-top: 2.625rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2071,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-description { font-size: 1.08rem; line-height: 1.58; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2075,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-eyebrow { font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2076,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-title { font-size: 3.5rem; line-height: 1.14; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2077,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-wrap { margin-top: 3.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2078,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-description { margin-top: 2.5rem; font-size: 1.25rem; line-height: 1.4; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2079,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-capabilities { font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2083,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-inner { padding-top: 1.8rem; padding-bottom: 2.2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2084,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-eyebrow { margin-bottom: 1rem; font-size: .82rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2085,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-title { font-size: 3rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2086,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-wrap { margin-top: 2.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2087,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-grid { height: 25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2088,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-description { margin-top: 1.8rem; font-size: 1.05rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2092,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-v2 { min-height: calc(100svh - 5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2093,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-toolbar { grid-template-columns: minmax(0, 1fr) 10.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2094,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tabs { border-right: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2095,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tools { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2096,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-grid { grid-template-columns: minmax(0, 1.35fr) minmax(13rem, .92fr); height: 24.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2097,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-files { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2098,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-source { border-left: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2102,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-v2 { min-height: calc(100svh - 4.7rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2103,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-inner { padding-top: 2rem; padding-bottom: 2.4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2104,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-eyebrow { margin-bottom: 1rem; padding-inline: .5rem; font-size: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2105,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-title { font-size: 2rem; line-height: 1.15; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2106,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-actions { margin-top: 1.25rem; gap: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2107,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-action { min-width: 7.9rem; min-height: 2.35rem; font-size: .84rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2108,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-wrap { width: min(100%, 35rem); margin-top: 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2109,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-titlebar { min-height: 2.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2110,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-saved,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2111,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-static-action { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2112,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-toolbar { grid-template-columns: minmax(0, 1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2113,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-pdf-label { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2114,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-grid { grid-template-columns: 1fr; height: 22rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2115,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-source { border-right: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2116,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-pdf { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2117,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace.is-mobile-pdf-visible .texise-hero-workspace-source { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2118,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace.is-mobile-pdf-visible .texise-hero-workspace-pdf { display: grid; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2119,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace.is-mobile-pdf-visible .texise-hero-pdf-page { width: min(82%, 13.5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2120,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-code { font-size: clamp(.53rem, 2.35vw, .64rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2121,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-code-content > div:nth-child(n+24),"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2122,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-line-numbers > span:nth-child(n+24) { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-document { padding: .9rem 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2124,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-visual-block { margin-bottom: .58rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2125,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-bottom { font-size: .53rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2126,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-bottom-actions > span:nth-child(2),"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2127,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-bottom-actions > span:nth-child(4) { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2128,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-description { max-width: 31rem; margin-top: 2rem; padding-inline: .4rem; font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2129,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-capabilities { gap: .7rem 1.1rem; margin-top: 1rem; font-size: .84rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2133,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-inner { padding-top: 1.65rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2134,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-title { font-size: 1.9rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2135,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-grid { height: 20.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2136,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-title { font-size: .64rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2137,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button.texise-hero-workspace-compile { padding-inline: .4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2138,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tabs > button,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2139,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-tabs > span { padding-inline: .34rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2140,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-capabilities { flex-direction: column; align-items: flex-start; gap: .5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2144,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-eyebrow,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2145,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-title,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2146,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-wrap,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2147,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-description,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2148,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-capabilities,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2149,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-pdf-page,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2150,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2151,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-terminal-trigger,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2152,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-spinner,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2153,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-terminal-caret {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2156,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2157,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-reveal-handle,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2158,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button.texise-hero-workspace-compile { transition: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2162,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-section {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2168,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-heading {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2173,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-heading .texise-eyebrow { display: inline-block; margin-bottom: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2174,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-heading h2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2177,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2183,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-grid {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2189,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-grid-more { margin-top: 1.35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2190,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-card {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2191,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-why-delay: 0ms;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2199,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 1px solid color-mix(in srgb, var(--texise-yellow) 68%, #8e7800);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2202,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2204,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "animation: texise-why-card-in .42s var(--texise-why-delay) ease both;"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2206,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-card h3 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2210,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2216,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-card p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2220,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-body);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2224,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-card-pin {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2234,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 1px solid color-mix(in srgb, var(--texise-yellow) 70%, #8e7800);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2240,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-toggle {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2251,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-body);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2256,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-section > .texise-why-toggle { display: flex; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2257,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-toggle:hover { color: var(--foreground); background: color-mix(in srgb, var(--secondary) 65%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2258,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-toggle:focus-visible { outline: 2px solid var(--foreground); outline-offset: 2px; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2259,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-toggle svg { transition: transform .18s ease; transform: rotate(90deg); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2260,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-toggle[aria-expanded='true'] svg { transform: rotate(-90deg); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2261,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@keyframes texise-why-card-in { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2264,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2267,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-section { width: min(100% - 1.5rem, 71rem); padding-block: 4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2268,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-heading { margin-bottom: 3rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2269,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-grid { grid-template-columns: 1fr; gap: 2.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2270,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-grid-more { margin-top: 2.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2271,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-card { min-height: 10.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2272,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-card h3,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2273,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-card p { padding-inline: 1.35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2276,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-card { animation: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2277,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-why-toggle svg { transition: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2281,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-share {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2287,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-share :is(a, button) {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2297,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font: 600 .75rem/1 var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2301,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-share :is(a, button):hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2302,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-color: var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2303,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 14%, var(--card));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2305,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-blog-share :is(a, button):focus-visible {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2311,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-grid {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2318,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-grid :is(select,input) { width: 100%; min-width: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2319,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-summary { display: flex; align-items: center; justify-content: space-between; gap: 1rem; margin: 0 0 1.1rem; color: var(--muted-foreground); font-size: .82rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2320,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-institution-card { display: grid; gap: .55rem; padding: 1.2rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); color: var(--foreground); text-decoration: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2321,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-institution-card:hover { border-color: var(--texise-yellow); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2322,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-institution-card h2 { margin: 0; font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2323,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-institution-card p { margin: 0; color: var(--muted-foreground); font-size: .82rem; line-height: 1.5; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2324,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-meta { display: flex; flex-wrap: wrap; gap: .35rem; margin-top: .6rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2325,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-meta span { padding: .24rem .5rem; border: 1px solid var(--border); border-radius: 999px; background: var(--secondary); font-size: .66rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2326,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-facts { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: .55rem; margin: 1.2rem 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2327,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-facts > div { padding: .65rem .75rem; border: 1px solid var(--border); border-radius: .65rem; background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2328,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-facts dt { color: var(--muted-foreground); font-size: .68rem; text-transform: uppercase; letter-spacing: .045em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2329,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-facts dd { margin: .15rem 0 0; font-size: .82rem; font-weight: 600; overflow-wrap: anywhere; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2330,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-features,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2331,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-packages { margin-top: 1.2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2332,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-features h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2333,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-packages h2 { margin: 0 0 .65rem; font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2334,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-features ul { display: grid; gap: .45rem; margin: 0; padding: 0; list-style: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2335,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-features li { display: flex; align-items: flex-start; gap: .45rem; font-size: .82rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2336,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-features li svg { flex: 0 0 auto; margin-top: .1rem; color: var(--texise-yellow-strong); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2338,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-layout { display: grid; grid-template-columns: minmax(30rem, 1.1fr) minmax(26rem, .9fr); gap: 1rem; align-items: start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2339,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-editor { min-width: 0; display: grid; gap: 1rem; padding: 1rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2340,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-editor-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2341,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-editor-head h2 { margin: .15rem 0 0; font-size: 1.1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2342,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: .55rem; margin-bottom: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2343,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-toolbar > div { display: grid; gap: .3rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2344,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-toolbar input[type='file'] { max-width: 18rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2345,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-form { display: grid; gap: 1.15rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2346,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-fields { display: grid; gap: .85rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2347,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-fields > div:not(.texise-error) { display: grid; gap: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2348,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-fields select { width: 100%; min-height: 2.25rem; border: 1px solid var(--input); border-radius: calc(var(--radius) - 2px); padding: .5rem .65rem; background: var(--background); color: var(--foreground); font: inherit; font-size: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2349,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-fields small { color: var(--muted-foreground); font-size: .72rem; line-height: 1.45; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2350,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-file { padding: .8rem; border: 1px dashed var(--border); border-radius: var(--texise-radius-lg); background: color-mix(in srgb, var(--secondary) 68%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2351,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-file > div:first-child { display: grid; gap: .25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2352,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-file > button { width: fit-content; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2353,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-file-selected { display: flex; align-items: center; gap: .55rem; padding: .6rem .7rem; border: 1px solid var(--border); border-radius: .6rem; background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-file-selected > span { display: grid; min-width: 0; gap: .12rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2355,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-file-selected strong { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: .78rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2356,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-create-template-file-selected small { font-size: .68rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2357,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-summary { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: .65rem; margin-bottom: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2358,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-summary article { padding: .8rem; border: 1px solid var(--border); border-radius: .7rem; background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2359,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-summary span { display: block; color: var(--muted-foreground); font-size: .7rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2360,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-summary strong { display: block; margin-top: .1rem; font-size: 1.2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2361,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-form-grid .texise-admin-form-span { grid-column: 1 / -1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2362,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-form-grid textarea,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2363,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-editor select { width: 100%; border: 1px solid var(--input); border-radius: calc(var(--radius) - 2px); padding: .5rem .65rem; background: var(--background); color: var(--foreground); font: inherit; font-size: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2364,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-editor textarea { resize: vertical; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2365,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-actions { display: flex; flex-wrap: wrap; gap: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2366,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-bulk { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin: .7rem 0; padding: .65rem; border: 1px solid var(--border); border-radius: .7rem; background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2367,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-institution-layout { grid-template-columns: minmax(26rem, 1fr) minmax(26rem, 1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2368,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-institution-list-name { display: flex; align-items: center; gap: .65rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2369,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-institution-list-name img { width: 2rem; height: 2rem; object-fit: contain; padding: .18rem; border: 1px solid var(--border); border-radius: .45rem; background: #fff; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2370,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-institution-logo { padding: .8rem; border: 1px solid var(--border); border-radius: .75rem; background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2371,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-institution-logo-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2372,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-institution-logo-head p { max-width: 34rem; margin: .25rem 0 0; color: var(--muted-foreground); font-size: .75rem; line-height: 1.45; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2373,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-institution-logo-preview { display: flex; align-items: center; gap: .75rem; margin-top: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2374,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-institution-logo-preview img { width: 4rem; height: 4rem; object-fit: contain; padding: .35rem; border: 1px solid var(--border); border-radius: .7rem; background: #fff; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2375,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-institution-logo-preview code { overflow-wrap: anywhere; color: var(--muted-foreground); font-size: .72rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2378,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-grid { grid-template-columns: repeat(3, minmax(0,1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2379,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-layout,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2380,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-institution-layout { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2383,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-page-head { flex-direction: column; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2384,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-page-actions { width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2385,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-page-actions > * { width: 100%; justify-content: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2386,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-grid { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2387,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-facts { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2388,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-summary { grid-template-columns: repeat(2, minmax(0,1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2389,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-layout { display: block; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2390,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-editor { margin-top: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2394,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-runnable-latex { overflow: hidden; margin: 1rem 0; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2395,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-runnable-toolbar { display: flex; align-items: center; justify-content: space-between; gap: .8rem; min-height: 2.4rem; padding: .35rem .55rem .35rem .75rem; border-bottom: 1px solid var(--border); background: var(--secondary); color: var(--muted-foreground); font: 600 .68rem/1 var(--texise-font-ui); text-transform: uppercase; letter-spacing: .05em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2396,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-runnable-toolbar > div { display: flex; gap: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2397,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-runnable-toolbar button { display: inline-flex; align-items: center; gap: .3rem; min-height: 1.8rem; padding: .35rem .55rem; border: 1px solid var(--border); border-radius: .45rem; background: var(--card); color: var(--foreground); font: 600 .7rem/1 var(--texise-font-ui); text-transform: none; letter-spacing: 0; cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2398,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-runnable-toolbar button:hover { border-color: var(--texise-yellow); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2399,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-runnable-latex .texise-learn-code { margin: 0; border: 0; border-radius: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2400,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-try-example { min-height: 45vh; display: grid; align-content: center; justify-items: start; gap: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2403,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-card { display: grid; align-content: start; gap: .65rem; color: var(--foreground); text-decoration: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2404,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-card .texise-text-link { margin-top: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2405,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-detail { display: grid; gap: clamp(3rem, 7vw, 6rem); padding-bottom: clamp(4rem, 8vw, 7rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2406,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-detail > .texise-page-heading { padding-inline: 0; padding-bottom: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2407,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-intro { max-width: 52rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2408,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-intro h2 { margin: 0 0 .7rem; font-family: var(--texise-font-display); font-size: clamp(1.8rem,3vw,2.8rem); font-weight: 300; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2409,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-intro p { margin: 0; color: var(--muted-foreground); font-size: 1.05rem; line-height: 1.7; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2410,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-flow { display: grid; grid-template-columns: repeat(5,minmax(0,1fr)); gap: .6rem; margin: 0; padding: 0; list-style: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2411,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-flow li { display: grid; gap: .5rem; padding: 1rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2412,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-flow li span { color: var(--texise-yellow-strong); font: 700 .7rem/1 var(--texise-font-ui); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2413,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-flow li strong { font-size: .82rem; line-height: 1.4; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2414,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@media (max-width: 64rem) { .texise-use-case-flow { grid-template-columns: repeat(2,minmax(0,1fr)); } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2415,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@media (max-width: 36rem) { .texise-use-case-flow { grid-template-columns: 1fr; } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2418,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-page { display: grid; gap: 2rem; max-width: 62rem; padding-block: clamp(2.5rem,5vw,5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2419,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-page > header { display: grid; gap: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2420,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-page > header h1 { margin: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2421,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-page > header p { max-width: 46rem; margin: 0; color: var(--muted-foreground); line-height: 1.6; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2422,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-panel { display: grid; gap: .7rem; padding: clamp(1rem,3vw,1.6rem); border: 1px solid var(--border); border-radius: var(--texise-radius-2xl); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2423,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-textarea { width: 100%; min-width: 0; resize: vertical; border: 1px solid var(--input); border-radius: .65rem; padding: .8rem; background: var(--background); color: var(--foreground); font: .82rem/1.55 var(--texise-font-mono); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2424,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-inline { display: flex; align-items: center; gap: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2425,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-inline select { border: 1px solid var(--input); border-radius: .5rem; padding: .45rem .6rem; background: var(--background); color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2426,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-result { padding: .9rem; border-radius: .7rem; background: var(--secondary); font-size: .82rem; line-height: 1.55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2427,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-result ul { margin: .6rem 0 0; padding-left: 1.2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2428,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-result p { margin: .4rem 0 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2429,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-cta { display: grid; gap: .55rem; justify-items: start; padding: 1.2rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2430,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-cta h2,.texise-tool-cta p { margin: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2431,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-tool-cta p { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2432,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-admin-metrics { margin-bottom: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2433,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-bulk-bar { display: flex; flex-wrap: wrap; align-items: center; gap: .5rem; margin: .7rem 0; padding: .65rem; border: 1px solid var(--border); border-radius: .7rem; background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2434,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-bulk-bar input { max-width: 13rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2435,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-table tr[data-selected='true'] { background: color-mix(in srgb, var(--texise-yellow) 10%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2436,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-editor-head code { display: block; max-width: 100%; margin-top: .3rem; color: var(--muted-foreground); font-size: .68rem; overflow-wrap: anywhere; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2438,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-validation{margin-top:1rem;padding:1rem;border:1px solid var(--border);border-radius:.75rem;background:var(--texise-surface-subtle)}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2439,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-validation.is-valid{border-color:color-mix(in srgb,#15803d 38%,var(--border))}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2440,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-validation.is-invalid{border-color:color-mix(in srgb,#b91c1c 40%,var(--border))}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2441,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-validation p,.texise-template-validation ul{margin:.45rem 0 0}.texise-template-validation span{display:block;margin-top:.75rem;font-weight:650}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2442,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-neighbours { display: grid; grid-template-columns: minmax(0,1fr) minmax(0,1fr); gap: 1rem; margin-top: 2.2rem; padding-top: 1.25rem; border-top: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2443,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-neighbours > :last-child { justify-self: end; text-align: right; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2444,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@media (max-width: 640px) { .texise-learn-neighbours { grid-template-columns: 1fr; } .texise-learn-neighbours > :last-child { justify-self: start; text-align: left; } }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2447,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-placeholder-pdf { gap: .5rem; align-content: center; color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2448,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-placeholder-pdf span { font-size: .78rem; font-weight: 650; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2449,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-preview-upload {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2454,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2457,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-preview-upload-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2458,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-preview-upload-head p { max-width: 42rem; margin: .3rem 0 0; color: var(--muted-foreground); font-size: .78rem; line-height: 1.5; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2459,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-preview-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: .45rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2460,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-preview-media { display: grid; gap: .45rem; overflow: hidden; border: 1px solid var(--border); border-radius: var(--texise-radius-lg); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2461,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-preview-media img { display: block; width: 100%; max-height: 24rem; object-fit: contain; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2462,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-thumbnail-media img { aspect-ratio: 210 / 297; max-height: 28rem; object-fit: contain; object-position: top center; background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2463,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-preview-media p { margin: 0; padding: .55rem .7rem; border-top: 1px solid var(--border); color: var(--muted-foreground); font-size: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2464,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-preview-empty { display: flex; min-height: 8rem; align-items: center; justify-content: center; gap: .55rem; border: 1px dashed var(--border); border-radius: var(--texise-radius-lg); color: var(--muted-foreground); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2467,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflows {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2473,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflows-heading { margin: 0 auto clamp(2rem, 4vw, 3rem); text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2474,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflows-heading h2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2477,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2483,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflows-heading p { margin: .65rem 0 0; color: var(--muted-foreground); font-size: clamp(.82rem, 1.4vw, 1rem); font-weight: 550; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2484,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-list { display: grid; gap: clamp(1rem, 2.3vw, 1.5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2485,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-card {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2497,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-card:nth-child(even) { flex-direction: row-reverse; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2498,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-copy { flex: 1 1 0; min-width: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2499,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-eyebrow { display: block; margin-bottom: 1rem; color: var(--muted-foreground); font-size: clamp(.75rem, 1.2vw, 1rem); font-weight: 650; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2500,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-copy h3 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2503,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2509,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-copy p { margin: clamp(1.25rem, 2.7vw, 2rem) 0 0; color: var(--muted-foreground); font-size: clamp(1rem, 1.8vw, 1.22rem); font-weight: 350; line-height: 1.55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2510,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-media { display: grid; flex: 1 1 0; min-width: 0; place-items: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2511,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-media img { display: block; width: min(100%, 25rem); aspect-ratio: 1 / 1; border-radius: 1.35rem; object-fit: cover; box-shadow: 0 .8rem 2rem color-mix(in srgb, var(--foreground) 10%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2514,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-preview-upload-head { flex-direction: column; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2515,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-preview-actions { justify-content: flex-start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2516,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflows { width: min(100% - 1.5rem, 71rem); padding-bottom: 4.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2517,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-card,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2518,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-card:nth-child(even) { min-height: 0; flex-direction: column; padding: 2rem; text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2519,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-copy { width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2520,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-media { width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2521,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-media img { width: min(100%, 20rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2525,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-directory-hero { padding-bottom: 2.6rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2526,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-directory-hero .texise-display { max-width: 62rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2527,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-hero-search {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2540,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-hero-search > svg { flex: 0 0 auto; color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2541,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-hero-search input { height: 2.5rem; border: 0; box-shadow: none; background: transparent; font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2542,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-intent-chips { display: flex; flex-wrap: wrap; gap: .5rem; margin-top: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2543,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-intent-chips :is(a,button) { border: 1px solid var(--border); border-radius: 999px; padding: .45rem .75rem; background: var(--card); color: var(--foreground); font: 600 .75rem/1.1 var(--texise-font-ui); text-decoration: none; cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2544,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-intent-chips :is(a,button):hover,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2545,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-intent-chips button[data-active='true'] { border-color: var(--texise-yellow); background: color-mix(in srgb, var(--texise-yellow) 14%, var(--card)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2546,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-directory-section { padding-block: 2.4rem; border-top: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2547,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-directory-heading { display: flex; align-items: flex-end; justify-content: space-between; gap: 2rem; margin-bottom: 1.3rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2548,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-directory-heading h2 { margin: .2rem 0 .35rem; font-family: var(--texise-font-display); font-size: clamp(1.7rem, 3vw, 2.65rem); font-weight: 400; line-height: 1.05; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2549,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-directory-heading p { max-width: 46rem; margin: 0; color: var(--muted-foreground); line-height: 1.55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2550,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-institution-strip { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2551,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-institution-card { grid-template-columns: 3.25rem minmax(0,1fr) auto; align-items: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2552,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-institution-card strong { font-size: .73rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2553,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-institution-mark { display: grid; place-items: center; width: 3.25rem; height: 3.25rem; border-radius: .8rem; background: color-mix(in srgb, var(--texise-yellow) 26%, var(--secondary)); color: var(--foreground); font: 700 .72rem/1 var(--texise-font-ui); text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2554,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-institution-mark img { width: 100%; height: 100%; object-fit: contain; padding: .35rem; border-radius: inherit; background: #fff; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2555,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-pagination { display: grid; grid-template-columns: auto 1fr auto; align-items: center; gap: .8rem; margin-top: 1.2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2556,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-pagination > div { display: flex; justify-content: center; align-items: center; gap: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2557,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-pagination button { min-width: 2.35rem; height: 2.35rem; padding: 0 .7rem; border: 1px solid var(--border); border-radius: .7rem; background: var(--card); color: var(--foreground); font: 650 .75rem/1 var(--texise-font-ui); cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2558,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-pagination button:hover:not(:disabled), .texise-template-pagination button[data-active='true'] { border-color: var(--texise-yellow); background: color-mix(in srgb, var(--texise-yellow) 14%, var(--card)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2559,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-pagination button:disabled { opacity: .45; cursor: not-allowed; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2560,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-category-grid { display: grid; grid-template-columns: repeat(3,minmax(0,1fr)); gap: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2561,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-category-card { min-height: 13rem; display: flex; align-items: flex-end; justify-content: space-between; gap: 1rem; padding: 1.3rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); color: var(--foreground); text-decoration: none; transition: transform .2s ease,border-color .2s ease,box-shadow .2s ease; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2562,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-category-card:hover { transform: translateY(-2px); border-color: var(--texise-yellow); box-shadow: 0 12px 34px rgb(0 29 56 / .07); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2563,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-category-card span { color: var(--muted-foreground); font: 700 .68rem/1 var(--texise-font-ui); text-transform: uppercase; letter-spacing: .055em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2564,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-category-card h3 { margin: .7rem 0 .4rem; font-family: var(--texise-font-display); font-size: 1.35rem; font-weight: 500; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2565,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-category-card p { margin: 0; color: var(--muted-foreground); font-size: .82rem; line-height: 1.55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2566,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-category-card > svg { flex: 0 0 auto; color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2567,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-featured-grid { grid-template-columns: repeat(4,minmax(0,1fr)); align-items: start; padding-bottom: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2568,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-sort { display: flex; align-items: center; gap: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2569,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-sort label { margin: 0; font-size: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2570,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-sort select,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2571,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel select,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2572,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-institution-directory-controls select { height: 2.5rem; border: 1px solid var(--input); border-radius: var(--texise-radius-lg); background: var(--background); color: var(--foreground); padding: 0 .7rem; font: inherit; font-size: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2573,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-browser { display: grid; grid-template-columns: minmax(13.5rem, .26fr) minmax(0,1fr); gap: 1.2rem; align-items: start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2574,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel { position: sticky; top: 5.5rem; display: grid; gap: 1rem; padding: 1rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2575,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel > div:not(.texise-template-filter-panel-head) { display: grid; gap: .4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2576,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel label { margin: 0; font-size: .72rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2577,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel select { width: 100%; min-width: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2578,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel-head { display: flex; align-items: center; justify-content: space-between; gap: .5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2579,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel-head button { border: 0; padding: 0; background: transparent; color: var(--texise-blue); font: 600 .72rem/1 var(--texise-font-ui); cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2580,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-tier-segment { width: 100%; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2581,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-tier-segment button { flex: 1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2582,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel details { border-top: 1px solid var(--border); padding-top: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2583,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel summary { cursor: pointer; font: 650 .75rem/1 var(--texise-font-ui); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2584,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-more-filters { display: grid; gap: .4rem; margin-top: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2585,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-results .texise-template-grid { grid-template-columns: repeat(3,minmax(0,1fr)); align-items: start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2586,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-preview-link { display: block; color: inherit; text-decoration: none; pointer-events: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2587,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-clickable { cursor: pointer; transition: border-color .15s ease, box-shadow .15s ease, transform .15s ease; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2588,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-clickable:hover { border-color: color-mix(in oklab, var(--texise-yellow) 60%, var(--border)); box-shadow: 0 10px 28px color-mix(in oklab, black 8%, transparent); transform: translateY(-1px); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2589,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-clickable:focus-visible { outline: 3px solid color-mix(in oklab, var(--texise-yellow) 70%, transparent); outline-offset: 3px; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2590,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-preview-link > img,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2591,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-preview-link > .texise-template-placeholder { width: 100%; aspect-ratio: 210 / 297; display: grid; place-items: center; object-fit: contain; object-position: top center; background: var(--secondary); border-bottom: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2592,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card h2 a { color: inherit; text-decoration: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2593,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card h2 a:hover { text-decoration: underline; text-decoration-color: var(--texise-yellow); text-underline-offset: .18em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2594,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-mini-meta { display: flex; flex-wrap: wrap; gap: .35rem; margin: .8rem 0; color: var(--muted-foreground); font-size: .68rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2595,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-mini-meta span { padding: .2rem .4rem; border-radius: 999px; background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2596,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-actions { display: flex; align-items: center; justify-content: space-between; gap: .6rem; margin-top: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2597,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-actions button { border: 0; padding: 0; background: transparent; color: var(--texise-blue); font: 650 .75rem/1 var(--texise-font-ui); cursor: pointer; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2598,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-actions button:hover { text-decoration: underline; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2599,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-dialog { width: min(94vw,72rem); max-width: 72rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2600,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-layout { display: grid; grid-template-columns: minmax(0,1.3fr) minmax(17rem,.7fr); gap: 1.2rem; align-items: start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2601,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-preview { min-height: 30rem; overflow: hidden; display: grid; place-items: center; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2602,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-preview img { width: 100%; height: 100%; object-fit: contain; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2603,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-copy { display: grid; gap: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2604,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-copy > p { margin: 0; color: var(--muted-foreground); line-height: 1.6; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2605,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-facts { display: grid; gap: .45rem; margin: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2606,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-facts > div { display: flex; justify-content: space-between; gap: 1rem; padding-block: .45rem; border-bottom: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2607,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-facts dt { color: var(--muted-foreground); font-size: .72rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2608,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-facts dd { margin: 0; font-size: .78rem; font-weight: 650; text-align: right; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2609,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-actions { display: flex; flex-wrap: wrap; gap: .55rem; align-items: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2610,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-actions .texise-apply-button { margin-top: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2611,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-missing-cta { margin-block: 2.5rem 5rem; padding-block: 2rem; display: flex; align-items: center; justify-content: space-between; gap: 2rem; border-top: 1px solid var(--border); border-bottom: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2612,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-missing-cta h2 { margin: .25rem 0 .4rem; font-family: var(--texise-font-display); font-size: clamp(1.7rem,3vw,2.6rem); font-weight: 400; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2613,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-missing-cta p { max-width: 42rem; margin: 0; color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2614,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-missing-actions { display: flex; flex-wrap: wrap; gap: .55rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2615,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-institution-directory-controls { display: grid; grid-template-columns: minmax(0,1fr) minmax(12rem,.25fr); gap: .75rem; align-items: center; margin-bottom: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2616,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-institution-directory-controls .texise-template-hero-search { width: 100%; margin: 0; min-height: 3rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2617,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-institution-country-group { padding-block: 1.4rem; border-top: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2618,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-institution-country-group .texise-template-directory-heading { margin-bottom: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2619,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-institution-template-page .texise-template-intent-chips { margin-bottom: 1.3rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2620,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-template-provenance-note { margin-bottom: 4rem; padding: 1rem 1.1rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--secondary); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2621,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-template-provenance-note p { margin: .35rem 0 0; color: var(--muted-foreground); font-size: .82rem; line-height: 1.55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2622,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-institution-detail-logo { display: flex; margin-bottom: .9rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2623,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-institution-detail-logo img { width: 5rem; height: 5rem; object-fit: contain; padding: .45rem; border: 1px solid var(--border); border-radius: .9rem; background: #fff; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2626,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-category-grid { grid-template-columns: repeat(2,minmax(0,1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2627,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-results .texise-template-grid { grid-template-columns: repeat(2,minmax(0,1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2628,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-institution-strip { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2631,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-browser { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2632,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel { position: static; grid-template-columns: repeat(2,minmax(0,1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2633,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel-head,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2634,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel details { grid-column: 1/-1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2635,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-layout { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2636,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-quick-preview { min-height: 20rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2637,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-missing-cta { align-items: flex-start; flex-direction: column; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2640,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-directory-heading { align-items: flex-start; flex-direction: column; gap: .8rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2641,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-category-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2642,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-results .texise-template-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2643,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-filter-panel,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2644,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-institution-directory-controls { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2645,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-category-card { min-height: 10.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2646,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-card-actions { align-items: flex-start; flex-direction: column; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2650,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-pagination { grid-template-columns: 1fr 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2651,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-pagination > div { grid-column: 1 / -1; grid-row: 1; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2652,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-pagination > button:last-child { justify-self: end; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2653,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-institution-logo-head { flex-direction: column; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2658,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-sort-button { display: inline-flex; align-items: center; gap: .35rem; border: 0; padding: 0; background: transparent; color: inherit; font: inherit; font-weight: 700; cursor: pointer; white-space: nowrap; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2659,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-sort-button span { color: var(--muted-foreground); font-size: .62rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2660,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-table th[aria-sort='ascending'] .texise-admin-sort-button span,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2661,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-table th[aria-sort='descending'] .texise-admin-sort-button span { color: var(--foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2662,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-editor-links { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: .45rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2663,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-private-preview { width: 100%; padding-block: 0 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2664,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-template-private-preview .texise-template-detail-copy { top: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2667,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-category-card-copy{display:grid;gap:.45rem;min-width:0}.texise-template-category-icon{display:inline-flex;align-items:center;justify-content:center;width:2.4rem;height:2.4rem;border-radius:.7rem;background:color-mix(in srgb,var(--texise-accent,#b7791f) 12%,transparent);color:var(--texise-accent,#9a650f);margin-bottom:.15rem}.texise-template-pdfjs{display:grid;gap:.65rem;width:100%;min-width:0}.texise-template-pdfjs-toolbar{display:flex;align-items:center;justify-content:space-be"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2668,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@media(max-width:720px){.texise-template-pdfjs-frame{min-height:22rem;padding:.5rem}.texise-template-pdfjs-toolbar{align-items:stretch}.texise-template-pdfjs-page-controls,.texise-template-pdfjs-zoom-controls{width:100%;justify-content:center}.texise-category-icon-grid{grid-template-columns:repeat(3,minmax(0,1fr))}.texise-category-icon-tile{min-height:78px}.texise-admin-category-icon-field{align-items:flex-start;flex-direction:column}}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2671,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-static-lucide-icon {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2684,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-featured-grid { grid-template-columns: repeat(2,minmax(0,1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2687,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-template-featured-grid { grid-template-columns: minmax(0,1fr); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2691,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-v3 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2694,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "radial-gradient(circle at 50% 0%, color-mix(in srgb, var(--texise-yellow) 12%, transparent), transparent 34rem),"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2697,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-v3-inner { max-width: 66rem; text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2698,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-v3 h1,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2699,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero h1,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2700,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-hero h1 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2702,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2709,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-v3 p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2710,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero > p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2711,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-hero > p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2718,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-v3 .texise-hero-actions,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2719,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero .texise-hero-actions { justify-content: center; margin-top: 1.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2720,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-product-visual { max-width: 74rem; padding-bottom: clamp(2.5rem, 6vw, 5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2721,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-product-visual .texise-hero-workspace { box-shadow: 0 28px 72px rgb(0 29 56 / .12); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2723,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-differentiators {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2729,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-differentiators article {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2735,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-differentiators article > svg { flex: 0 0 auto; margin-top: .15rem; color: var(--texise-yellow-strong); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2736,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-differentiators h2 { margin: 0; font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2737,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-differentiators p { margin: .35rem 0 0; color: var(--muted-foreground); font-size: .9rem; line-height: 1.6; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2739,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-public-section { padding-block: clamp(3.5rem, 7vw, 6.5rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2740,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-public-section .texise-section-heading > h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2741,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-section .texise-section-heading > h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2742,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-next .texise-section-heading > h2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2744,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2750,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-public-section .texise-section-heading > p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2751,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-section .texise-section-heading > p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2757,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-centered-heading { max-width: 48rem; margin-inline: auto; text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2758,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-centered-heading > p { margin-inline: auto !important; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2759,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-grid {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2765,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-grid article {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2769,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2771,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "transition: border-color var(--texise-transition-fast), transform var(--texise-transition-fast);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2773,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-grid article:hover { border-color: color-mix(in srgb, var(--texise-yellow) 70%, var(--border)); transform: translateY(-2px); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2774,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-icon {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2779,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 1px solid color-mix(in srgb, var(--texise-yellow) 62%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2781,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 16%, var(--card));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2784,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-grid h3 { margin: 1.15rem 0 .5rem; font-size: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2785,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-grid p { margin: 0; color: var(--muted-foreground); font-size: .9rem; line-height: 1.62; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2786,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-section-action { display: flex; justify-content: center; margin-top: 1.75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2788,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2793,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison .texise-page-container { max-width: 64rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2794,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison-table { margin-top: 2.25rem; border-radius: var(--texise-radius-2xl); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2795,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison-table .texise-compare-table { min-width: 46rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2796,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison-table :is(th, td) { padding: .82rem 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2797,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison-table tbody tr:hover { background: color-mix(in srgb, var(--secondary) 55%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2798,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison-table .texise-compare-texise { color: var(--foreground); font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2799,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison-table thead .texise-compare-texise { box-shadow: inset 0 -2px 0 var(--texise-yellow); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2800,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-comparison-cta { display: grid; justify-items: center; gap: .75rem; margin-top: 1.5rem; text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2801,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-comparison-cta p { margin: 0; color: var(--muted-foreground); font-size: .9rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2803,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-section { padding-block: clamp(3.5rem, 7vw, 6rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2804,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-section-home { padding-top: clamp(4rem, 8vw, 7rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2805,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-heading { max-width: 48rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2806,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-cards {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2813,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2821,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-2xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2824,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card-featured {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2825,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-color: color-mix(in srgb, var(--texise-yellow) 78%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2826,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: linear-gradient(180deg, color-mix(in srgb, var(--texise-yellow) 10%, var(--card)), var(--card) 38%);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2829,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card-head > div { display: flex; align-items: center; justify-content: space-between; gap: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2830,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card h3 { margin: 0; font-family: var(--texise-font-display); font-size: 1.55rem; font-weight: 400; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2831,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-badge { padding: .3rem .55rem; border-radius: 999px; background: var(--texise-yellow); color: var(--texise-navy); font-size: .68rem; font-weight: 800; letter-spacing: .03em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2832,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card-head > strong { display: block; margin-top: 1.15rem; font-family: var(--texise-font-display); font-size: clamp(1.7rem, 2.5vw, 2.4rem); font-weight: 400; line-height: 1.05; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2833,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card-head > p { min-height: 3rem; margin: .65rem 0 0; color: var(--muted-foreground); font-size: .9rem; line-height: 1.55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2834,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card ul { display: grid; gap: .62rem; margin: 1.4rem 0 1.5rem; padding: 1.25rem 0 0; border-top: 1px solid var(--border); list-style: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2835,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card li { display: flex; gap: .55rem; color: var(--muted-foreground); font-size: .84rem; line-height: 1.45; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2836,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card li svg { flex: 0 0 auto; margin-top: .08rem; color: var(--texise-yellow-strong); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2837,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card > .texise-button { margin-top: auto; align-self: stretch; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2838,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-compare-link { display: inline-flex; margin-top: 1.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2839,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-matrix { min-width: 52rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2840,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-reassurance { display: flex; flex-wrap: wrap; gap: .6rem 1.2rem; padding-block: 1.25rem 3.5rem; color: var(--muted-foreground); font-size: .84rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2841,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-reassurance span { display: inline-flex; align-items: center; gap: .4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2842,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-reassurance svg { color: var(--texise-yellow-strong); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2844,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-section { max-width: 48rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2845,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-heading { max-width: 40rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2846,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list { max-width: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2847,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list details { overflow: hidden; transition: border-color var(--texise-transition-fast), box-shadow var(--texise-transition-fast); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2848,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list details[open] { border-color: color-mix(in srgb, var(--texise-yellow) 55%, var(--border)); box-shadow: 0 8px 24px rgb(0 29 56 / .05); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2849,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list summary { display: flex; align-items: center; justify-content: space-between; gap: 1rem; list-style: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2850,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list summary::-webkit-details-marker { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2851,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list summary:focus-visible { outline: 2px solid var(--texise-yellow-strong); outline-offset: -3px; border-radius: var(--texise-radius-lg); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2852,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list summary svg { flex: 0 0 auto; transition: transform var(--texise-transition-fast); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2853,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-faq-list details[open] summary svg { transform: rotate(180deg); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2855,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-final-cta { text-align: left; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2856,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-final-cta h2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2858,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2864,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-final-cta p { max-width: 42rem; margin: .65rem 0 0; font-size: clamp(1rem, 1.4vw, 1.08rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2865,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-final-cta .texise-hero-actions { margin-top: 1.15rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2867,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero { max-width: 68rem; padding-block: clamp(4rem, 8vw, 7rem) clamp(2rem, 5vw, 4rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2868,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero h1 { margin-inline: 0; max-width: 13ch; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2869,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero > p { margin-inline: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2870,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero .texise-hero-actions { justify-content: flex-start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2871,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-editorial { padding-bottom: clamp(3rem, 7vw, 6rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2872,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-editorial article {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2880,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-editorial-copy { position: relative; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2881,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-index { margin-left: .6rem; color: var(--muted-foreground); font-size: .72rem; font-weight: 700; letter-spacing: .08em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2882,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-editorial h2 { margin: 1rem 0 .6rem; font-family: var(--texise-font-display); font-size: clamp(1.75rem, 3vw, 2.7rem); font-weight: 400; letter-spacing: -.025em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2883,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-editorial p { max-width: 42rem; margin: 0; color: var(--muted-foreground); line-height: 1.68; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2884,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-editorial ul { display: grid; gap: .55rem; margin: .35rem 0 0; padding: 0; list-style: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2885,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-editorial li { display: flex; gap: .55rem; align-items: center; min-height: 2.5rem; padding: .55rem .75rem; border-bottom: 1px solid var(--border); color: var(--muted-foreground); font-size: .88rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2886,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-editorial li svg { flex: 0 0 auto; color: var(--texise-yellow-strong); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2888,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-index { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem; padding-bottom: clamp(3rem, 7vw, 6rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2889,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-index-card { display: flex; min-height: 15rem; flex-direction: column; padding: 1.35rem; border: 1px solid var(--border); border-radius: var(--texise-radius-xl); background: var(--card); color: inherit; text-decoration: none; transition: border-color var(--texise-transition-fast), transform var(--texise-transition-fast); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2890,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-index-card:hover { border-color: color-mix(in srgb, var(--texise-yellow) 68%, var(--border)); transform: translateY(-2px); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2891,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-index-card h2 { margin: .75rem 0 .5rem; font-family: var(--texise-font-display); font-size: 1.35rem; font-weight: 400; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2892,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-index-card p { margin: 0; color: var(--muted-foreground); font-size: .9rem; line-height: 1.6; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2893,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-index-card .texise-text-link { margin-top: auto; padding-top: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2894,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-detail-v2 { max-width: 68rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2895,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-hero { padding-block: clamp(3.5rem, 7vw, 6rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2896,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-hero > .texise-text-link { display: inline-flex; margin-bottom: 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2897,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-hero h1 { max-width: 14ch; margin-inline: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2898,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-hero > p { margin-inline: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2899,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-context { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; padding-block: 2rem 4rem; border-top: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2900,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-context > div { padding-right: clamp(1rem, 4vw, 3rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2901,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-context h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2902,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-help h2 { margin: .55rem 0 .6rem; font-family: var(--texise-font-display); font-size: clamp(1.45rem, 2.5vw, 2rem); font-weight: 400; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2903,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-context p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2904,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-help p { margin: 0; color: var(--muted-foreground); line-height: 1.65; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2905,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-help { display: grid; grid-template-columns: .9fr 1.1fr; gap: clamp(2rem, 6vw, 5rem); padding-block: 4rem; border-top: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2906,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-capabilities { display: grid; gap: .35rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2907,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-capabilities > div { display: flex; gap: .75rem; padding: .85rem 0; border-bottom: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2908,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-capabilities > div > svg { flex: 0 0 auto; margin-top: .18rem; color: var(--texise-yellow-strong); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2909,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-capabilities h3 { margin: 0; font-size: .95rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2910,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-capabilities p { margin-top: .25rem; font-size: .86rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2911,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-next { padding-block: 4rem; border-top: 1px solid var(--border); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2912,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-next ol { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: .75rem; margin: 1.75rem 0 0; padding: 0; list-style: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2913,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-next li { min-height: 7rem; padding: 1rem; border-top: 2px solid var(--texise-yellow); background: color-mix(in srgb, var(--secondary) 55%, transparent); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2914,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-next li span { display: block; margin-bottom: 1.25rem; color: var(--muted-foreground); font-size: .7rem; font-weight: 800; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2915,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-next li strong { font-size: .84rem; line-height: 1.45; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2918,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2919,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-cards,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2920,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-index { grid-template-columns: repeat(2, minmax(0, 1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2921,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-differentiators { grid-template-columns: 1fr; gap: .25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2922,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-next ol { grid-template-columns: repeat(3, minmax(0, 1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2926,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-v3 { padding-top: 3.4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2927,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-v3 h1,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2928,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero h1,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2929,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-hero h1 { font-size: clamp(2.45rem, 12vw, 4rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2930,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2931,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-cards,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2932,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-index,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2933,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-editorial article,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2934,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-context,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2935,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-help,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2936,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-next ol { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2937,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-pricing-card { min-height: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2938,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-editorial article { gap: 1.4rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2939,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-use-case-context { gap: 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2940,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-final-cta { padding: 1.6rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2944,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-features-section .texise-why-heading p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2951,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-features-grid { margin-top: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2952,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-feature-card {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2954,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "transition: transform var(--texise-transition-fast), box-shadow var(--texise-transition-fast);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2956,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-feature-card:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2960,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-features-section .texise-section-action { margin-top: 2rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2962,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflows-heading .texise-eyebrow {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2966,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflows-heading p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2971,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-subtitle {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2979,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-secondary {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2983,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-capabilities {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2990,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-media img {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 2999,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-media.is-wide {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3002,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-media.is-wide img { width: min(100%, 34rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3004,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-check {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3009,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 1px solid color-mix(in srgb, var(--texise-yellow) 72%, #8e7800);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3012,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3018,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison-table tbody td.texise-compare-texise { text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3021,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-media img { width: min(100%, 22rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3022,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-media.is-wide img { width: min(100%, 28rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3026,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-power-feature-card { transition: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3031,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-inner {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3036,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-eyebrow { margin-bottom: clamp(1.4rem, 2vh, 2rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3037,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-actions { margin-top: clamp(1.55rem, 2.4vh, 2.15rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3038,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-workspace-wrap { margin-top: clamp(2.75rem, 4.25vh, 4.4rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3039,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-hero-description { margin-top: clamp(2.3rem, 3.5vh, 3.35rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3040,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-capabilities { margin-top: clamp(1.1rem, 1.8vh, 1.6rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3043,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison .texise-section-heading > h2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3045,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3053,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3058,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero h1 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3064,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero > p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3068,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-page-hero .texise-hero-actions { justify-content: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3070,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-card-section {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3074,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-grid-heading {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3078,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-grid-heading .texise-eyebrow { display: inline-block; margin-bottom: .75rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3079,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-grid-heading > h2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3081,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3088,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-grid-heading > p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3094,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-card-grid {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3099,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-card-v2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3107,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "transition: border-color var(--texise-transition-fast), box-shadow var(--texise-transition-fast), transform var(--texise-transition-fast);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3109,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-card-v2:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3111,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-color: color-mix(in srgb, var(--texise-yellow) 58%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3114,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-card-icon {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3120,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 1px solid color-mix(in srgb, var(--texise-yellow) 38%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 20%, var(--background));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3125,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-card-v2 h3 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3132,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-card-v2 > p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3138,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-card-v2 ul {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3145,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-card-v2 li {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3153,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-card-v2 li svg {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3156,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color: var(--texise-yellow-strong);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3160,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-card-grid { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3161,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-features-card-section { width: min(100% - 1.5rem, 72rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3162,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-card-v2 { padding: 1.3rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3166,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-feature-card-v2 { transition: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3171,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-home-workflow-copy h3 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3174,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison .texise-section-heading {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3177,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison-table {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3182,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison-table .texise-compare-table :is(th, td):nth-child(2),"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3183,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison-table .texise-compare-table :is(th, td):nth-child(3) {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3189,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison .texise-section-heading > h2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3192,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-product-comparison .texise-section-heading > p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3197,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-comparison-links {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3204,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-hero,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3205,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-hero {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3210,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-hero h1,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3211,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-hero h1 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3214,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3221,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-hero > p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3222,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-hero > p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3229,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-hero .texise-hero-actions,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3230,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-hero .texise-hero-actions {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3234,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-back {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3240,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strengths,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3241,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3242,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-capabilities,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3243,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-section,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3244,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3248,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strengths .texise-section-heading,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3249,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory .texise-section-heading,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3250,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-capabilities .texise-section-heading,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3251,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-section .texise-section-heading,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3252,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing .texise-section-heading {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3256,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strengths .texise-section-heading > h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3257,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory .texise-section-heading > h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3258,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-capabilities .texise-section-heading > h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3259,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-section .texise-section-heading > h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3260,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing .texise-section-heading > h2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3262,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3269,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strengths .texise-section-heading > p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3270,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory .texise-section-heading > p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3271,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-section .texise-section-heading > p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3277,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strength-grid {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3282,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strength-grid article,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3283,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory-card,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3284,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-two-column article,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3285,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing-grid article {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3292,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strength-grid article {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3295,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strength-grid article > span {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3300,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 1px solid color-mix(in srgb, var(--texise-yellow) 45%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3302,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 18%, var(--background));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3304,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strength-grid h3,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3305,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory-card h3,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3306,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing-grid h3 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3312,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strength-grid p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3313,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory-card p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3314,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing-grid p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3320,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strength-grid .texise-compare-fit-label {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3327,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strength-grid .texise-compare-fit-label + h3 { margin-top: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3329,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory-grid {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3334,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory-card {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3339,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "transition: transform var(--texise-transition-fast), border-color var(--texise-transition-fast), box-shadow var(--texise-transition-fast);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3341,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory-card:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3343,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-color: color-mix(in srgb, var(--texise-yellow) 58%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3346,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory-card .texise-text-link {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3351,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-capability-list {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3358,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-capability-list > span {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3368,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-capability-list svg { flex: none; color: color-mix(in srgb, var(--texise-yellow) 72%, #6d5c00); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3370,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-table {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3372,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-2xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3374,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-table .texise-compare-table { min-width: 48rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3375,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-table .texise-compare-table :is(th, td):nth-child(2),"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3376,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-table .texise-compare-table :is(th, td):nth-child(3) {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3380,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-table .texise-compare-texise {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3384,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-table thead .texise-compare-texise {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3385,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "box-shadow: inset 0 -2px 0 var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3388,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-two-column {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3395,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-two-column article {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3398,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-two-column h2 {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3400,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3405,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-two-column ul {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3412,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-two-column li {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3418,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-two-column li svg { flex: none; margin-top: .25rem; color: color-mix(in srgb, var(--texise-yellow) 72%, #6d5c00); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3420,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing-grid {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3425,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing-grid article {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3428,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing-grid article.is-texise {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3429,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-color: color-mix(in srgb, var(--texise-yellow) 58%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3430,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "box-shadow: inset 0 3px 0 var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3432,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing-grid p + p { margin-top: .45rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3433,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing-grid .texise-text-link { display: inline-flex; margin-top: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3434,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-reviewed {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3444,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strength-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3447,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-directory-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3448,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-capability-list,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3449,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-two-column,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3450,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-pricing-grid,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3451,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-strength-grid { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3452,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-hero,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3453,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-hero { text-align: left; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3454,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-hero h1,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3455,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-hero h1,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3456,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-hero > p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3457,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-hero > p { margin-left: 0; margin-right: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3458,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-hero .texise-hero-actions,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3459,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-hero .texise-hero-actions { justify-content: flex-start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3460,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-detail-hero .texise-compare-back { margin-left: 0; margin-right: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3464,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-page { padding-bottom: clamp(4rem, 8vw, 7rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3465,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-page :is(h1, h2, h3) { font-family: var(--texise-font-display); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3466,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-page .texise-eyebrow { font-family: var(--texise-font-ui); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3467,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-contact .texise-button { font-family: var(--texise-font-display); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3468,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-hero {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3473,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-hero .texise-display {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3479,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-hero > p {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3486,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-team-image {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3494,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-team-image img { display: block; width: 100%; height: auto; aspect-ratio: 1672 / 941; object-fit: cover; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3495,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-section { max-width: 58rem; padding-block: clamp(2.75rem, 5vw, 4.75rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3496,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-section h2,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3497,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-contact h2 { margin: 0; font-size: clamp(2rem, 4vw, 3.65rem); line-height: 1.04; letter-spacing: -.025em; font-weight: 400; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3498,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-mission { max-width: 50rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3499,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-mission > p,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3500,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-portability > p { margin: 1.15rem 0 0; color: var(--muted-foreground); font-size: 1rem; line-height: 1.75; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3501,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-section-heading { max-width: 42rem; margin-bottom: 1.6rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3502,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-values { display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 1rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3503,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-values article {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3507,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-2xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3510,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-value-icon {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3516,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 70%, var(--card));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3517,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color: var(--texise-navy);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3519,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-values h3 { margin: 2rem 0 .65rem; font-size: 1.05rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3520,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-values p { margin: 0; color: var(--muted-foreground); line-height: 1.65; font-size: .9rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3521,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-team-card {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3527,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-2xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3530,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-team-card h2 { margin: 0; font-size: clamp(1.8rem, 3.4vw, 3rem); line-height: 1.08; font-weight: 400; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3531,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-team-card p { margin: 0 0 1rem; color: var(--muted-foreground); line-height: 1.72; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3532,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-team-card p:last-child { margin-bottom: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3533,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-links { display: flex; flex-wrap: wrap; gap: 1rem 1.5rem; margin-top: 1.3rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3534,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-contact {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3538,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 1px solid color-mix(in srgb, var(--texise-yellow) 65%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3539,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-2xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3540,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: linear-gradient(135deg, color-mix(in srgb, var(--texise-yellow) 22%, var(--card)), color-mix(in srgb, var(--texise-yellow) 6%, var(--card)) 62%, var(--card));"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3543,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-contact p { max-width: 38rem; margin: 1rem auto 1.5rem; color: var(--muted-foreground); line-height: 1.65; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3546,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-page { max-width: 48rem; padding-block: clamp(5rem, 9vw, 8rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3547,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-heading { max-width: 42rem; margin: 0 auto clamp(2rem, 5vw, 3.5rem); text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3548,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-heading .texise-display { font-size: clamp(2.75rem, 6vw, 5rem); line-height: .96; letter-spacing: -.04em; font-weight: 400; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3549,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-heading p { margin: 1.15rem auto 0; color: var(--muted-foreground); line-height: 1.65; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3550,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-card-wrap { max-width: 34rem; margin-inline: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3551,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-apply-card-wrap .texise-license-link-card { padding: clamp(1.25rem, 3vw, 1.7rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3552,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-apply-license-gate { position: relative; max-width: 34rem; min-height: 24rem; margin-inline: auto; overflow: hidden; border-radius: var(--texise-radius-2xl); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3553,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-apply-license-blurred { pointer-events: none; user-select: none; filter: blur(4px); opacity: .48; transform: scale(.99); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3554,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-apply-license-blurred .texise-license-link-card { min-height: 24rem; padding: 1.7rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3555,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-login-overlay {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3565,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-2xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3570,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-login-overlay h2 { margin: 0; font-size: clamp(1.5rem, 3vw, 2rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3571,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-login-overlay p { max-width: 27rem; margin: .75rem 0 1.2rem; color: var(--muted-foreground); line-height: 1.55; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3572,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-login-button { background: var(--texise-yellow); color: var(--texise-navy); border-color: color-mix(in srgb, var(--texise-yellow-strong) 72%, var(--texise-navy)); min-width: 8.5rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3573,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-login-button:hover { background: var(--texise-yellow-strong); color: var(--texise-navy); transform: translateY(-1px); box-shadow: 0 8px 20px rgb(0 29 56 / .12); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3574,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-note { max-width: 34rem; margin: 1rem auto 0; color: var(--muted-foreground); font-size: .78rem; line-height: 1.5; text-align: center; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3575,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-loading { max-width: 34rem; min-height: 18rem; margin-inline: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3576,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-license-current-plan { display: grid; grid-template-columns: 1fr auto; gap: .15rem .75rem; padding: .7rem .8rem; border: 1px solid var(--border); border-radius: var(--texise-radius-lg); background: var(--secondary); font-size: .82rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3577,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-license-current-plan > span { color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3578,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-license-current-plan > strong { text-align: right; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3579,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-license-current-plan > small { grid-column: 1 / -1; color: var(--muted-foreground); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3580,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": ".texise-pricing-license-link { display: flex; align-items: center; gap: .35rem; flex-wrap: wrap; margin: .7rem 0 0; color: var(--muted-foreground); font-size: .85rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3583,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-values,"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3584,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-team-card { grid-template-columns: 1fr; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3585,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-values article { min-height: auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3586,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-team-card { gap: 1.25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3587,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-about-team-image { width: min(calc(100% - 1rem), var(--texise-content-width)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3588,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-apply-page { width: min(calc(100% - 1rem), 48rem); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3592,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-status { display: inline-flex; align-items: center; gap: .42rem; line-height: 1.35; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3593,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-status.is-positive svg { color: var(--texise-bronze-700); flex: 0 0 auto; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3594,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".dark .texise-compare-status.is-positive svg { color: var(--texise-bronze-300); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3595,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-status.is-negative { color: var(--texise-graphite-500); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3596,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-status .texise-compare-tick {"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3604,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3605,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color: var(--texise-graphite-950);"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3607,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-status .texise-compare-tick svg { color: currentColor; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3608,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-migration { list-style: none; margin: 2rem auto 0; padding: 0; max-width: 52rem; display: grid; gap: .85rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3609,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-migration li { display: grid; grid-template-columns: 2rem minmax(0,1fr); gap: .8rem; align-items: start; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3610,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-migration li > span { width: 2rem; height: 2rem; border-radius: 999px; display: inline-flex; align-items: center; justify-content: center; background: var(--texise-bronze-100); color: var(--texise-bronze-900); font-weight: 700; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3611,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".dark .texise-compare-migration li > span { background: color-mix(in srgb, var(--texise-bronze-500) 18%, transparent); color: var(--texise-bronze-200); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3612,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-migration p { margin: .28rem 0 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3613,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-compare-sources { list-style: none; margin: 1.5rem auto 0; padding: 0; max-width: 52rem; display: grid; gap: .7rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3616,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-change-log-page{padding-top:4rem;padding-bottom:6rem;max-width:980px}.texise-change-log-heading{max-width:760px;margin-bottom:3rem}.texise-change-log-heading h1{margin:.5rem 0 1rem}.texise-change-log-heading>.texise-prose{font-size:1.05rem;color:var(--muted-foreground)}.texise-change-log-timeline{display:grid;gap:0}.texise-change-log-event{display:grid;grid-template-columns:180px minmax(0,1fr);gap:2rem;position:relative;padding:0 0 2.5rem}.texise-change-log-event:not(:last-child)::after{"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3617,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@media (max-width:720px){.texise-change-log-page{padding-top:2.5rem}.texise-change-log-event{grid-template-columns:1fr;gap:.65rem;padding-bottom:1.5rem}.texise-change-log-event:not(:last-child)::after,.texise-change-log-card::before{display:none}.texise-change-log-date{justify-content:flex-start}.texise-change-log-card{padding:1.25rem}}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3620,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-filters{display:flex;flex-wrap:wrap;gap:.55rem;padding-bottom:1.25rem}.texise-learn-filters select{min-height:2.45rem;border:1px solid var(--border);border-radius:.6rem;background:var(--card);color:var(--foreground);padding:0 .7rem;font:inherit}.texise-learn-section{display:grid;gap:1rem;padding-block:1.5rem}.texise-learn-course-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:.8rem}.texise-learn-course-card{display:grid;gap:.7rem;min-width:0;padding:1rem;border:"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3621,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-learn-layout{display:grid;grid-template-columns:minmax(14rem,20rem) minmax(0,1fr);gap:1rem;align-items:start}.texise-admin-learn-courses{display:grid;gap:.4rem;position:sticky;top:4.5rem}.texise-admin-learn-courses button,.texise-admin-learn-lesson-list>button{display:flex;align-items:center;justify-content:space-between;gap:.6rem;width:100%;padding:.7rem;border:1px solid var(--border);border-radius:.65rem;background:var(--card);color:var(--foreground);text-align:left}.texise-admin"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3622,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@media(max-width:64rem){.texise-learn-course-grid{grid-template-columns:repeat(2,minmax(0,1fr))}.texise-admin-learn-layout{grid-template-columns:1fr}.texise-admin-learn-courses{position:static;grid-template-columns:repeat(2,minmax(0,1fr))}.texise-admin-learn-lessons{grid-template-columns:1fr}}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3623,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@media(max-width:44rem){.texise-learn-course-grid{grid-template-columns:1fr}.texise-learn-outline>article{grid-template-columns:1fr}.texise-learn-interactive-card{align-items:stretch;flex-direction:column}.texise-admin-learn-course-form{grid-template-columns:1fr}.texise-admin-learn-wide{grid-column:auto}.texise-admin-learn-courses{grid-template-columns:1fr}}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3626,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-filters input[type=\"search\"]{min-width:min(22rem,100%);min-height:2.45rem;border:1px solid var(--border);border-radius:.6rem;background:var(--card);color:var(--foreground);padding:0 .75rem;font:inherit}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3627,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-blocks{display:grid;gap:1.1rem;margin-top:1.4rem}.texise-learn-block{min-width:0}.texise-learn-callout{padding:.9rem 1rem;border:1px solid var(--border);border-radius:.8rem;background:var(--secondary);white-space:pre-wrap}.texise-learn-callout p{margin:.3rem 0 0}.texise-learn-media,.texise-learn-video{display:grid;gap:.55rem;margin:1.2rem 0}.texise-learn-media img{display:block;max-width:100%;height:auto;border-radius:.85rem}.texise-learn-media figcaption,.texise-learn-video figcap"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3628,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@media(max-width:44rem){.texise-learn-filters input[type=\"search\"]{width:100%;min-width:0}.texise-learn-video{margin-inline:-.2rem}.texise-learn-video-frame{border-radius:.65rem}}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3629,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-learn-interactive-actions{display:flex;flex-wrap:wrap;gap:.55rem;justify-content:flex-end}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3630,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "@media(max-width:44rem){.texise-learn-interactive-actions{justify-content:stretch}.texise-learn-interactive-actions .texise-button{flex:1}}"
    },
    {
      "path": "packages/tooling/browser-entry/src/saas.css",
      "line": 3631,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-admin-learn-cover-preview{display:block;width:min(14rem,100%);max-height:8rem;object-fit:cover;border:1px solid var(--border);border-radius:.65rem;background:var(--muted)}"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 2,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "import { TEXISE_LOCATION_CHANGE_EVENT } from './ws-boot-surface';"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 4,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const COOKIE_PREFERENCE_KEY = 'texise-cookie-consent-v1';"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 5,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const STATCOUNTER_SCRIPT_ID = 'texise-statcounter-script';"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 6,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const GOOGLE_TAG_SCRIPT_ID = 'texise-google-tag-script';"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 97,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "script.dataset.texiseAnalytics = 'statcounter';"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 138,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "script.dataset.texiseAnalytics = 'google-tag';"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 152,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<section className=\"texise-cookie-notice\" aria-label=\"Cookie preferences\" data-texise-cookie-notice=\"true\">"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 157,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<div className=\"texise-cookie-actions\" role=\"group\" aria-label=\"Cookie preference actions\">"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 158,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<button type=\"button\" className=\"texise-cookie-button texise-cookie-button-primary\" onClick={onAccept}>Accept cookies</button>"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 159,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<button type=\"button\" className=\"texise-cookie-button texise-cookie-button-secondary\" onClick={onDecline}>Decline cookies</button>"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 168,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "href=\"https://x.com/texiser\""
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 194,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "export function TeXiseSiteTelemetry() {"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 203,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "window.addEventListener(TEXISE_LOCATION_CHANGE_EVENT, synchronize);"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 207,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "window.removeEventListener(TEXISE_LOCATION_CHANGE_EVENT, synchronize);"
    },
    {
      "path": "packages/tooling/browser-entry/src/site-telemetry.tsx",
      "line": 247,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_COOKIE_PREFERENCE_KEY = COOKIE_PREFERENCE_KEY;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 74,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-yellow: #DA0B4E;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 75,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-yellow-strong: #B80A42;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 76,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-blue: #5773ff;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 77,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-success: #70c038;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 78,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-danger: #ff6b38;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 79,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-navy: #001d38;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 80,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-warm-50: #f8f6f2;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 81,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-warm-100: #f1ede4;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 82,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-neutral-200: #e2e2df;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 83,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-neutral-300: #b5b7ba;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 84,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-neutral-400: #8b8e93;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 85,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-neutral-600: #62656a;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 86,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-neutral-700: #383d3f;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 87,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-dark-700: #181f25;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 88,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-dark-800: #111518;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 89,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-dark-900: #101519;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 91,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-radius-xs: 0.125rem;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 92,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-radius-sm: 0.25rem;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 93,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-radius-md: 0.375rem;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 94,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-radius-lg: 0.5rem;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 95,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-radius-xl: 0.75rem;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 96,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-radius-2xl: 1rem;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 97,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-radius-3xl: 1.5rem;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 98,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-radius-4xl: 2rem;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 99,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-transition-fast: 150ms;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 100,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-transition-normal: 220ms;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 101,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-app-breakpoint: 67rem;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 102,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-content-width: 80rem;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 104,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-font-ui: 'Learnitive Inter', Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont,"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 106,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-font-display: 'Learnitive Moranga', Georgia, 'Times New Roman', serif;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 107,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-font-mono: 'Learnitive JetBrains Mono', 'JetBrains Mono', ui-monospace, SFMono-Regular, Menlo,"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 109,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-font-manuscript: 'Learnitive STIX Two Text', STIXGeneral,"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 113,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-keyword: #7c3fb0;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 114,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-command: #3157c8;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 115,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-type: #9a3412;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 116,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-property: #8a4b08;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 117,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-name: #0f766e;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 118,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-string: #1f7a52;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 119,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-number: #b45309;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 120,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-comment: #6b7280;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 121,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-operator: #3854a8;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 122,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-punctuation: #59626d;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 156,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--BV-font-sans: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 190,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-keyword: #d8b4fe;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 191,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-command: #9aaaff;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 192,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-type: #fdba74;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 193,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-property: #fcd34d;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 194,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-name: #5eead4;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 195,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-string: #86efac;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 196,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-number: #fbbf24;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 197,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-comment: #9ca3af;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 198,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-operator: #a5b4fc;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 199,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-syntax-punctuation: #c4c9cf;"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 264,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 270,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-display,"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 271,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[data-texise-display='true'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 272,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-display);"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 277,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-title { font-weight: 700; letter-spacing: -0.035em; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 278,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-hero-title em { font-weight: 400; font-style: italic; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 287,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 296,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-manuscript);"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 303,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-manuscript);"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 308,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-app-surface {"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 313,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-card {"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 317,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-2xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 321,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-control-transition {"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 322,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "transition-duration: var(--texise-transition-fast);"
    },
    {
      "path": "packages/tooling/browser-entry/src/texise-design.css",
      "line": 329,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-control-transition {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-boot-surface.ts",
      "line": 1,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "export type TeXiseBootSurface = 'editor' | 'projects' | 'home' | 'saas';"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-boot-surface.ts",
      "line": 3,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_LOCATION_CHANGE_EVENT = 'texise:locationchange';"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-boot-surface.ts",
      "line": 12,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "export function installTeXiseLocationChangeBridge(windowRef: Window): void {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-boot-surface.ts",
      "line": 13,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const history = windowRef.history as History & { __texiseLocationBridge?: boolean };"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-boot-surface.ts",
      "line": 14,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "if (history.__texiseLocationBridge) return;"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-boot-surface.ts",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "history.__texiseLocationBridge = true;"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-boot-surface.ts",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "windowRef.dispatchEvent(new Event(TEXISE_LOCATION_CHANGE_EVENT));"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-boot-surface.ts",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "windowRef.dispatchEvent(new Event(TEXISE_LOCATION_CHANGE_EVENT));"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-boot-surface.ts",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "export function resolveTeXiseBootSurface("
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-boot-surface.ts",
      "line": 38,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "): TeXiseBootSurface {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 3,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "* Scope every rule to /ws via data-texise-surface so public SaaS pages and"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 6,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 7,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--texise-app-titlebar-height: 42px;"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 10,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] body {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-ws-header {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 19,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--background) 88%, var(--texise-warm-100));"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 21,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .BU_dark-scheme .texise-ws-header,"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 24,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'].BU_dark-scheme .texise-ws-header {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 27,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-ws-brand {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 34,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font: 600 .8rem/1 var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 37,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-ws-brand > img {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 43,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-ws-brand > strong { font-weight: 600; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 44,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-compile-primary[data-slot='button'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 45,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 1px solid color-mix(in srgb, var(--texise-yellow-strong) 75%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 46,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-md);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 47,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 48,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color: var(--texise-navy);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 52,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-compile-primary[data-slot='button']:hover {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 53,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-yellow-strong);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 57,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-editor-account { position: relative; margin-left: .15rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 58,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-editor-avatar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 70,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font: 650 .68rem/1 var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 72,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-editor-avatar img { width: 100%; height: 100%; object-fit: cover; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 73,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-account-popover { z-index: 160; width: min(14rem, calc(100vw - 2rem)); font-family: var(--texise-font-ui); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 77,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-slot='sidebar-wrapper'] { background: var(--background); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 78,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-sidebar='sidebar'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 82,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 84,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-sidebar='header'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 89,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-sidebar='footer'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 93,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-sidebar='group-label'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 100,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-sidebar='menu-button'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 101,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-md);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 104,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-sidebar='menu-button'][data-active='true'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 105,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: color-mix(in srgb, var(--texise-yellow) 20%, var(--sidebar-accent));"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 107,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "box-shadow: inset 2px 0 0 var(--texise-yellow-strong);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 109,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-sidebar='header'] button[type='button'] > [data-sidebar='group'] > [data-sidebar='group-content'] > div {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 112,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-md);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 116,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-source'],"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 117,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-visual'],"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 118,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-pdf-preview'],"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 119,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-project-outline'],"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 120,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-paper-memory'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 125,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-source'] > div:first-child,"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 126,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-visual'] > div:first-child,"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 127,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-pdf-toolbar'],"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 128,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-output-tabs'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 132,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-source'] > div:first-child,"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 133,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-visual'] > div:first-child {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 137,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-output-tabs'] > button {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 141,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-output-tabs'] > button[class*='border-primary'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 142,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-bottom-color: var(--texise-yellow-strong);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 145,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-pdf-preview']:not([class*='fixed']) {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 152,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-source'] .cm-editor,"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 153,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-source'] .cm-content,"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 154,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-source'] .cm-gutters {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 155,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 157,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-source'] .cm-editor { background: var(--background); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 158,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-source'] .cm-gutters { border-right-color: var(--border); background: color-mix(in srgb, var(--secondary) 34%, var(--background)); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 160,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/* Visual manuscript gets a paper canvas but STIX remains scoped by texise-design.css. */"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 161,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-visual'] > div[class*='overflow-auto'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 164,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-visual'] .ProseMirror {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 170,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-sm);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 175,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .BU_dark-scheme [data-editor-engine='latex-visual'] .ProseMirror,"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 176,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'].BU_dark-scheme [data-editor-engine='latex-visual'] .ProseMirror {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 182,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-ai-overlay'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 184,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 187,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 189,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-ai-overlay'] > div:first-child {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 192,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-ai-shell'] > [data-slot='button'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 193,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border: 1px solid color-mix(in srgb, var(--texise-yellow-strong) 65%, var(--border));"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 194,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-yellow);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 195,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "color: var(--texise-navy);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 197,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-paper-memory'] :is(article,details,[class*='rounded-lg'][class*='border']) {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 202,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='terminal-open'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 205,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-dark-700);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 207,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 209,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='project-terminal'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 211,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-dark-900);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 214,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-mono);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 216,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='project-terminal'] > header {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 219,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-dark-700);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 221,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 223,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='project-terminal'] select {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 225,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-dark-800);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 230,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-slot='dialog-content'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 232,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-xl);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 235,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 237,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-slot='dropdown-menu-content'],"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 238,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-slot='dropdown-menu-sub-content'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 240,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-lg);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 243,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 245,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-slot='dropdown-menu-item'] { border-radius: var(--texise-radius-md); }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 246,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-slot='tooltip-content'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 247,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "border-radius: var(--texise-radius-md);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 248,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "background: var(--texise-navy);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 250,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 254,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-review-sidebar'],"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 255,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [aria-label='Comments'] {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 258,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "font-family: var(--texise-font-ui);"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 262,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-ws-brand > strong { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 263,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] .texise-ws-header { padding-inline: .45rem; gap: .25rem; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 264,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-editor-engine='latex-visual'] .ProseMirror {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 270,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] [data-testid='texise-ai-overlay'] { border-radius: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 274,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] *,"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 275,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] *::before,"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 276,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "html[data-texise-surface='editor'] *::after {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 286,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-editor-toolbar {"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 294,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-editor-toolbar::-webkit-scrollbar { display: none; }"
    },
    {
      "path": "packages/tooling/browser-entry/src/ws-learnitive.css",
      "line": 295,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": ".texise-editor-toolbar > * { flex-shrink: 0; }"
    },
    {
      "path": "packages/tooling/browser-entry/translations-plugin.ts",
      "line": 34,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "name: 'texise-translations',"
    },
    {
      "path": "packages/tooling/browser-entry/vite.config.ts",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LOCALE_VERSION_PLACEHOLDER = '__TEXISE_LOCALE_VERSION__';"
    },
    {
      "path": "packages/tooling/browser-entry/vite.config.ts",
      "line": 56,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "name: 'texise-mathlive-fonts',"
    },
    {
      "path": "packages/tooling/browser-entry/vite.config.ts",
      "line": 151,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "port: readPortEnv('TEXISE_DEV_PORT'),"
    },
    {
      "path": "packages/tooling/browser-entry/vite.config.ts",
      "line": 158,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "port: readPortEnv('TEXISE_PREVIEW_PORT'),"
    },
    {
      "path": "packages/tooling/browser-entry/vite.config.ts",
      "line": 179,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "__TEXISE_ENTITLEMENT_PUBLIC_KEY__: JSON.stringify("
    },
    {
      "path": "packages/tooling/browser-entry/vite.config.ts",
      "line": 180,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "process.env.TEXISE_ENTITLEMENT_PUBLIC_KEY_PEM?.trim() || '',"
    },
    {
      "path": "packages/tooling/browser-entry/vite.config.ts",
      "line": 182,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "__TEXISE_ENTITLEMENT_KEY_ID__: JSON.stringify("
    },
    {
      "path": "packages/tooling/browser-entry/vite.config.ts",
      "line": 183,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "process.env.TEXISE_ENTITLEMENT_KEY_ID?.trim() || '',"
    },
    {
      "path": "packages/tooling/custom-scripts/config.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "rootPkg: 'texise',"
    },
    {
      "path": "packages/tooling/custom-scripts/config.ts",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "url: 'https://www.texise.com',"
    },
    {
      "path": "packages/tooling/custom-scripts/config.ts",
      "line": 23,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "name: 'TeXise',"
    },
    {
      "path": "packages/tooling/custom-scripts/config.ts",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "web: 'https://www.texise.com',"
    },
    {
      "path": "packages/tooling/custom-scripts/config.ts",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "homepage: 'https://www.texise.com',"
    },
    {
      "path": "packages/tooling/custom-scripts/config.ts",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "url: 'https://www.texise.com/contact',"
    },
    {
      "path": "packages/tooling/custom-scripts/config.ts",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texisePackageConfig: {"
    },
    {
      "path": "packages/tooling/custom-scripts/config.ts",
      "line": 37,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export const texiseWorkspaceConfigSchema = z.object({"
    },
    {
      "path": "packages/tooling/custom-scripts/config.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export const texisePackageConfigSchema = z.object({"
    },
    {
      "path": "packages/tooling/custom-scripts/config.ts",
      "line": 69,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export type TexiseWorkspaceConfig = z.infer<typeof texiseWorkspaceConfigSchema>;"
    },
    {
      "path": "packages/tooling/custom-scripts/config.ts",
      "line": 70,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export type TexisePackageConfig = z.infer<typeof texisePackageConfigSchema>;"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texisePackageConfigSchema,"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texiseWorkspaceConfigSchema,"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 20,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texiseWorkspaceConfig: TexiseWorkspaceConfig;"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 44,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "get texiseWorkspaceConfig() {"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "return this.data.texiseWorkspaceConfig;"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 49,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "if (this.texiseWorkspaceConfig.allowedWorkspaces.includes('*')) {"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "for (const wsName of this.texiseWorkspaceConfig.allowedWorkspaces) {"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 82,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texisePackageConfig: TexisePackageConfig;"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 96,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texiseWorkspaceConfig?: TexiseWorkspaceConfig;"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 97,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texisePackageConfig?: TexisePackageConfig;"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 125,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "return p.packageJSON.texiseWorkspaceConfig;"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 128,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const config = p.packageJSON.texiseWorkspaceConfig;"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 131,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texiseWorkspaceConfigSchema.parse(config);"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 139,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texiseWorkspaceConfig: p.packageJSON.texiseWorkspaceConfig,"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 148,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const texisePackageConfig = p.packageJSON.texisePackageConfig as"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 151,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "if (texisePackageConfig?.skipValidation) {"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 156,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "!p.packageJSON.texiseWorkspaceConfig &&"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 174,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const texisePackageConfig = p.packageJSON.texisePackageConfig;"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 178,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texisePackageConfigSchema.parse(texisePackageConfig);"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 191,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texisePackageConfig: texisePackageConfig,"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 225,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "return this.texisePackageConfig.env;"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 238,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "get texisePackageConfig() {"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 239,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "return this.packageState.texisePackageConfig;"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 254,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "if (packageState.packageJSON.texiseWorkspaceConfig) {"
    },
    {
      "path": "packages/tooling/custom-scripts/lib/workspace-helper.ts",
      "line": 540,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "if (content.includes('// @texise-ignore-checks')) {"
    },
    {
      "path": "packages/tooling/custom-scripts/package.json",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/tooling/custom-scripts/package.json",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/tooling/custom-scripts/package.json",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/__tests__/local-ci-check.integration.spec.ts",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const INHERITED_LOCK_ENV = 'TEXISE_LOCAL_CI_LOCKED';"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/__tests__/local-ci-check.integration.spec.ts",
      "line": 144,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const directory = await mkdtemp(join(tmpdir(), 'texise-local-ci-cli-'));"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/__tests__/local-ci-check.integration.spec.ts",
      "line": 153,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "cwd: '/tmp/texise-worktree',"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/__tests__/local-ci-check.integration.spec.ts",
      "line": 200,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expectOutput(second, 'Waiting for the TeXise local CI lock');"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/__tests__/local-ci-check.integration.spec.ts",
      "line": 298,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expectOutput(contender, 'Waiting for the TeXise local CI lock');"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/__tests__/local-ci-check.spec.ts",
      "line": 26,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const directory = await mkdtemp(join(tmpdir(), 'texise-local-ci-'));"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/__tests__/local-ci-check.spec.ts",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "cwd: '/tmp/texise-worktree',"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/__tests__/local-ci-check.spec.ts",
      "line": 65,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'/repo/main/.git/texise-local-ci.lock',"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/format-package-json.ts",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texisePackageConfig,"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/format-package-json.ts",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texisePackageConfig: {"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/format-package-json.ts",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "...PACKAGE_JSON_DEFAULTS.texisePackageConfig,"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/format-package-json.ts",
      "line": 55,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "...texisePackageConfig,"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/local-ci-check.ts",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const LOCK_FILE_NAME = 'texise-local-ci.lock';"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/local-ci-check.ts",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const INHERITED_LOCK_ENV = 'TEXISE_LOCAL_CI_LOCKED';"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/local-ci-check.ts",
      "line": 166,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "'Lost the TeXise local CI lock before starting its command.',"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/local-ci-check.ts",
      "line": 253,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "`Waiting for the TeXise local CI lock held by ${description}.`,"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/local-ci-check.ts",
      "line": 384,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "console.log(`Acquired the TeXise local CI lock for ${root}.`);"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/remove-unused-deps.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const texiseDepsInCode = new Set("
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/remove-unused-deps.ts",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const texiseDepsInPkgJson = new Set("
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/remove-unused-deps.ts",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const unused = [...setDifference(texiseDepsInPkgJson, texiseDepsInCode)];"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/remove-unused-deps.ts",
      "line": 105,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const texiseDepsInCode = new Set(deps);"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/remove-unused-deps.ts",
      "line": 107,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const texiseDepsInPkgJson = new Set(["
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/remove-unused-deps.ts",
      "line": 112,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const unused = [...setDifference(texiseDepsInPkgJson, texiseDepsInCode)];"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/validate-all.ts",
      "line": 95,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "/^(@texise\\/[^/]+)\\/src(?:\\/|$)/;"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/validate-all.ts",
      "line": 278,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "!pkg.texisePackageConfig.allowedRuntimeImports?.includes(dep) &&"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/validate-all.ts",
      "line": 350,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "if (pkg.texisePackageConfig.kind !== 'js-util') {"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/validate-all.ts",
      "line": 360,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "if (dep.texisePackageConfig.kind !== 'js-util') {"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/validate-all.ts",
      "line": 362,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "`Package  ${name} ${pkg.packageJSONPath} kind: ${pkg.texisePackageConfig.kind} imports \"${dep.name}\" which is a ${dep.texisePackageConfig.kind} package."
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/validate-all.ts",
      "line": 403,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "if (!pkg.texisePackageConfig.kind.startsWith('service-')) {"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/validate-all.ts",
      "line": 407,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const pkgKind = pkg.texisePackageConfig.kind;"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/validate-all.ts",
      "line": 425,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "if (dep.texisePackageConfig.kind.startsWith('service-')) {"
    },
    {
      "path": "packages/tooling/custom-scripts/scripts/validate-all.ts",
      "line": 426,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const depKind = dep.texisePackageConfig.kind;"
    },
    {
      "path": "packages/tooling/desktop-entry/electron-builder.config.cjs",
      "line": 3,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const channel = process.env.TEXISE_DESKTOP_CHANNEL || 'latest';"
    },
    {
      "path": "packages/tooling/desktop-entry/electron-builder.config.cjs",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const version = process.env.TEXISE_RELEASE_VERSION;"
    },
    {
      "path": "packages/tooling/desktop-entry/electron-builder.config.cjs",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "process.env.TEXISE_DESKTOP_PRODUCT_NAME ||"
    },
    {
      "path": "packages/tooling/desktop-entry/electron-builder.config.cjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "(channel === 'nightly' ? 'TeXise Nightly' : 'TeXise');"
    },
    {
      "path": "packages/tooling/desktop-entry/electron-builder.config.cjs",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const shouldSign = process.env.TEXISE_DESKTOP_SIGN === 'true';"
    },
    {
      "path": "packages/tooling/desktop-entry/electron-builder.config.cjs",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const shouldNotarize = process.env.TEXISE_DESKTOP_NOTARIZE === 'true';"
    },
    {
      "path": "packages/tooling/desktop-entry/electron-builder.config.cjs",
      "line": 21,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "appId: isStable ? 'com.texise.desktop' : 'com.texise.desktop.nightly',"
    },
    {
      "path": "packages/tooling/desktop-entry/electron-builder.config.cjs",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "owner: 'texise',"
    },
    {
      "path": "packages/tooling/desktop-entry/electron-builder.config.cjs",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "repo: 'texise',"
    },
    {
      "path": "packages/tooling/desktop-entry/package.json",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/tooling/desktop-entry/scripts/dist.ts",
      "line": 175,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_RELEASE_VERSION: metadata.version,"
    },
    {
      "path": "packages/tooling/desktop-entry/scripts/dist.ts",
      "line": 176,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DESKTOP_CHANNEL: metadata.channel,"
    },
    {
      "path": "packages/tooling/desktop-entry/scripts/dist.ts",
      "line": 177,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DESKTOP_PRODUCT_NAME: metadata.productName,"
    },
    {
      "path": "packages/tooling/desktop-entry/scripts/dist.ts",
      "line": 178,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DESKTOP_SIGN: canSign ? 'true' : 'false',"
    },
    {
      "path": "packages/tooling/desktop-entry/scripts/dist.ts",
      "line": 179,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DESKTOP_NOTARIZE: canNotarize ? 'true' : 'false',"
    },
    {
      "path": "packages/tooling/desktop-entry/scripts/smoke-test.mjs",
      "line": 46,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "NodePath.join(NodeOS.tmpdir(), 'texise-desktop-smoke-'),"
    },
    {
      "path": "packages/tooling/desktop-entry/scripts/smoke-test.mjs",
      "line": 59,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DESKTOP_BROWSER_DIST: browserDistDir,"
    },
    {
      "path": "packages/tooling/desktop-entry/scripts/smoke-test.mjs",
      "line": 111,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return `texise://app/ws#route=editor&wsPath=${encodeURIComponent("
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol-handler.spec.ts",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "browserDistDir: '/tmp/texise-browser-dist',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol-handler.spec.ts",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "browserDistDir: '/tmp/texise-browser-dist',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol-handler.spec.ts",
      "line": 43,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "`Desktop app protocol is already registered for ${resolve('/tmp/texise-browser-dist')}, cannot re-register for ${resolve('/tmp/other-browser-dist')}`,"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol.spec.ts",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const rootDir = resolve('/tmp/texise-browser-dist');"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol.spec.ts",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "requestUrl: 'texise://app/assets/index-abc123.js',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol.spec.ts",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "requestUrl: 'texise://app/%2e%2e/secret.md',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol.spec.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "requestUrl: 'texise://settings/index.html',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol.spec.ts",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "requestUrl: 'file:///tmp/texise-browser-dist/index.html',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol.spec.ts",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(shouldServeIndexFallback('texise://app/ws#route=editor')).toBe(true);"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol.spec.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(shouldServeIndexFallback('texise://app/settings')).toBe(true);"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol.spec.ts",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(shouldServeIndexFallback('texise://app/assets/missing.js')).toBe("
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/protocol.spec.ts",
      "line": 67,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(shouldServeIndexFallback('https://www.texise.com/ws')).toBe(false);"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/release-metadata.spec.ts",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(resolveProductName('latest')).toBe('TeXise');"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/release-metadata.spec.ts",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(resolveProductName('nightly')).toBe('TeXise Nightly');"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/release-metadata.spec.ts",
      "line": 43,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "productName: 'TeXise',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/release-metadata.spec.ts",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "productName: 'TeXise Nightly',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/updater.spec.ts",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "owner: 'texise',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/updater.spec.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "repo: 'texise',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/window.spec.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(decideNavigation('texise://app/#route=home')).toEqual({"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/window.spec.ts",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "url: 'texise://app/#route=home',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/window.spec.ts",
      "line": 121,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'document.documentElement.setAttribute(\"data-texise-desktop-platform\", \"darwin\");',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/__tests__/window.spec.ts",
      "line": 144,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'document.documentElement.setAttribute(\"data-texise-desktop-platform\", \"darwin\");',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/desktop-document.ts",
      "line": 1,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const DESKTOP_PLATFORM_ATTRIBUTE = 'data-texise-desktop-platform';"
    },
    {
      "path": "packages/tooling/desktop-entry/src/main.ts",
      "line": 31,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const override = process.env.TEXISE_DESKTOP_BROWSER_DIST?.trim();"
    },
    {
      "path": "packages/tooling/desktop-entry/src/main.ts",
      "line": 111,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "console.error('[desktop] Failed to start TeXise desktop.', error);"
    },
    {
      "path": "packages/tooling/desktop-entry/src/main.ts",
      "line": 113,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "'TeXise could not start',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/preload.ts",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "contextBridge.exposeInMainWorld('texiseDesktop', {"
    },
    {
      "path": "packages/tooling/desktop-entry/src/protocol.ts",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "export const APP_PROTOCOL = 'texise';"
    },
    {
      "path": "packages/tooling/desktop-entry/src/release-metadata.ts",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const override = process.env.TEXISE_RELEASE_VERSION?.trim();"
    },
    {
      "path": "packages/tooling/desktop-entry/src/release-metadata.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "return channel === 'nightly' ? 'TeXise Nightly' : 'TeXise';"
    },
    {
      "path": "packages/tooling/desktop-entry/src/release-metadata.ts",
      "line": 115,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "? `TeXise Nightly ${version}`"
    },
    {
      "path": "packages/tooling/desktop-entry/src/release-metadata.ts",
      "line": 116,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": ": `TeXise v${version}`,"
    },
    {
      "path": "packages/tooling/desktop-entry/src/updater.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "owner: 'texise',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/updater.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "repo: 'texise',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/updater.ts",
      "line": 85,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "message: 'A TeXise update is available.',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/updater.ts",
      "line": 106,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "message: 'A TeXise update is ready.',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/updater.ts",
      "line": 107,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "detail: 'Restart TeXise to finish installing the update.',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/window.ts",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "title: 'TeXise',"
    },
    {
      "path": "packages/tooling/desktop-entry/src/window.ts",
      "line": 60,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (url.protocol === 'texise:' && url.hostname === 'app') {"
    },
    {
      "path": "packages/tooling/e2e-tests/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/tooling/e2e-tests/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "\"url\": \"https://www.texise.com/support.html\""
    },
    {
      "path": "packages/tooling/e2e-tests/package.json",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/tooling/e2e-tests/playwright-ct.config.ts",
      "line": 53,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "ctPort: readPortEnv('TEXISE_E2E_CT_PORT', 3100),"
    },
    {
      "path": "packages/tooling/e2e-tests/playwright.config.ts",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_E2E_PORT',"
    },
    {
      "path": "packages/tooling/e2e-tests/playwright.config.ts",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "readPortEnv('TEXISE_DEV_PORT', 5173),"
    },
    {
      "path": "packages/tooling/e2e-tests/playwright.config.ts",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const BASE_URL = process.env.TEXISE_E2E_BASE_URL ?? `http://localhost:${PORT}`;"
    },
    {
      "path": "packages/tooling/e2e-tests/playwright.config.ts",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const useExternalServer = process.env.TEXISE_E2E_EXTERNAL_SERVER === '1';"
    },
    {
      "path": "packages/tooling/e2e-tests/playwright.config.ts",
      "line": 116,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "command: `TEXISE_DEV_PORT=${PORT} pnpm --dir ../browser-entry exec vite --configLoader runner --host localhost --port ${PORT} --strictPort`,"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/__tests__/run-e2e-ci.spec.ts",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_E2E_SHARD must use Playwright shard syntax such as 1/2.',"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-e2e-ci.ts",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const host = process.env.TEXISE_E2E_HOST ?? '127.0.0.1';"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-e2e-ci.ts",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export function getShardArgs(value = process.env.TEXISE_E2E_SHARD): string[] {"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-e2e-ci.ts",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_E2E_SHARD must use Playwright shard syntax such as 1/2.',"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-e2e-ci.ts",
      "line": 34,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (process.env.TEXISE_E2E_PORT) {"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-e2e-ci.ts",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return process.env.TEXISE_E2E_PORT;"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-e2e-ci.ts",
      "line": 119,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const baseUrl = process.env.TEXISE_E2E_BASE_URL ?? `http://${host}:${port}`;"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-e2e-ci.ts",
      "line": 172,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_E2E_BASE_URL: baseUrl,"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-e2e-ci.ts",
      "line": 173,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_E2E_EXTERNAL_SERVER: '1',"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-release-e2e.ts",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const host = process.env.TEXISE_E2E_HOST ?? '127.0.0.1';"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-release-e2e.ts",
      "line": 50,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'src/latex-visual-bf4-texise-native.e2e.ts',"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-release-e2e.ts",
      "line": 90,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return process.env.TEXISE_E2E_PORT ?? execFileSync(process.execPath, ['scripts/dev-ports.js', 'e2e'], { cwd: repoRoot, encoding: 'utf8' }).trim();"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-release-e2e.ts",
      "line": 121,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env: { ...process.env, CI: '1', TEXISE_RELEASE_QUALITY: '1', TEXISE_E2E_BASE_URL: baseUrl, TEXISE_E2E_EXTERNAL_SERVER: '1' },"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-scientific-runtime-e2e.ts",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const host = process.env.TEXISE_E2E_HOST ?? '127.0.0.1';"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-scientific-runtime-e2e.ts",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const port = process.env.TEXISE_E2E_PORT ?? '5188';"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-scientific-runtime-e2e.ts",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_RELEASE_QUALITY: '1',"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-scientific-runtime-e2e.ts",
      "line": 58,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SCIENTIFIC_RUNTIME_LIVE: '1',"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-scientific-runtime-e2e.ts",
      "line": 59,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_C_CPP_LIVE: process.env.TEXISE_C_CPP_LIVE ?? '1',"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-scientific-runtime-e2e.ts",
      "line": 60,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_E2E_BASE_URL: baseUrl,"
    },
    {
      "path": "packages/tooling/e2e-tests/scripts/run-scientific-runtime-e2e.ts",
      "line": 61,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_E2E_EXTERNAL_SERVER: '1',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/admin-template-categories-hotfix10.e2e.ts",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "user: { id: 1, email: 'admin@texise.test', displayName: 'Template Admin', avatarUrl: null, role: 'admin', status: 'active' },"
    },
    {
      "path": "packages/tooling/e2e-tests/src/admin-template-categories-hotfix10.e2e.ts",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-admin-category-icon-choice')).toContainText('FlaskConical');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/admin-template-categories-hotfix10.e2e.ts",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.locator('.texise-admin-category-editor').getByRole('button', { name: 'Create category' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/admin-template-create-hotfix10.e2e.ts",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "email: 'admin@texise.test',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/admin-template-create-hotfix10.e2e.ts",
      "line": 72,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "provenance: 'texise',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/admin-template-create-hotfix10.e2e.ts",
      "line": 117,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const editor = page.locator('.texise-admin-template-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/app-shell-layout.e2e.ts",
      "line": 183,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "root.setAttribute('data-texise-window-controls-overlay', 'visible');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/app-shell-layout.e2e.ts",
      "line": 184,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "root.setAttribute('data-texise-window-controls-overlay-controls', 'both');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/app-shell-layout.e2e.ts",
      "line": 186,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-titlebar-area-x',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/app-shell-layout.e2e.ts",
      "line": 190,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-titlebar-area-width',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/app-shell-layout.e2e.ts",
      "line": 193,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "root.style.setProperty('--texise-titlebar-area-height', '40px');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/asset-workflow.e2e.ts",
      "line": 412,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/asset-workflow.e2e.ts",
      "line": 512,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/asset-workflow.e2e.ts",
      "line": 565,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/browser-git.e2e.ts",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'../fixtures/texise-source-project.zip',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/browser-git.e2e.ts",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByLabel('Author name').fill('TeXise Test');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/browser-git.e2e.ts",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByLabel('Author email').fill('test@texise.local');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/browser-history-navigation.e2e.ts",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'TeXise' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/browser-history-navigation.e2e.ts",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/browser-latex-compile.e2e.ts",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'../fixtures/texise-source-project.zip',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/browser-latex-compile.e2e.ts",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const pdfPreview = page.getByTestId('texise-pdf-preview');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/browser-latex-compile.e2e.ts",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const logPane = pdfPreview.getByTestId('texise-compile-log');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/browser-latex-compile.e2e.ts",
      "line": 77,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await pdfPreview.getByTestId('texise-output-tabs').getByRole('button', { name: 'PDF' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/clipboard-markdown.e2e.ts",
      "line": 200,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'TeXise' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/common.ts",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/delete-note-dialog.e2e.ts",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/delete-note-dialog.e2e.ts",
      "line": 65,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/editor-cursor-position.e2e.ts",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'TeXise' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/editor-cursor-position.e2e.ts",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".getByTestId('texise-file-explorer')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/editor-math.e2e.ts",
      "line": 83,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(displayMath).toHaveAttribute('data-texise-math-view', '');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer-file-operations.e2e.ts",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer-file-operations.e2e.ts",
      "line": 128,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer-file-operations.e2e.ts",
      "line": 185,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 49,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "return page.getByTestId('texise-file-explorer').evaluate((explorer) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 77,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".getByTestId('texise-file-explorer')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 169,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "return page.getByTestId('texise-file-explorer').evaluate((explorer) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 294,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 406,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const firstExplorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 407,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const secondExplorer = secondPage.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 453,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 493,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 554,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 575,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'TeXise' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 779,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 837,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 892,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 976,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 1229,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/file-explorer.e2e.ts",
      "line": 1282,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/fixtures/workspaces/markdown-edge-cases/nested/deep/10-raw-html.md",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "<script>globalThis.__texiseFixtureScriptExecuted = true</script>"
    },
    {
      "path": "packages/tooling/e2e-tests/src/fixtures/workspaces/markdown-edge-cases/nested/deep/10-raw-html.md",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "<img src=\"missing.png\" onerror=\"globalThis.__texiseFixtureHandlerExecuted = true\">"
    },
    {
      "path": "packages/tooling/e2e-tests/src/fixtures/workspaces/markdown-edge-cases/nested/deep/10-raw-html.md",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "<iframe src=\"javascript:globalThis.__texiseFixtureIframeExecuted=true\"></iframe>"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-advanced-visual-bibliography.e2e.ts",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'../fixtures/texise-r7-project.zip',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-advanced-visual-bibliography.e2e.ts",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-advanced-visual-bibliography.e2e.ts",
      "line": 20,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-inline-citation')).toContainText('smith2026');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-advanced-visual-bibliography.e2e.ts",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-inline-reference')).toContainText('fig:one');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-advanced-visual-bibliography.e2e.ts",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-inline-footnote')).toContainText('plain note');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-advanced-visual-bibliography.e2e.ts",
      "line": 23,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-figure-image')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-advanced-visual-bibliography.e2e.ts",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-figure')).toContainText('Result image');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-advanced-visual-bibliography.e2e.ts",
      "line": 26,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await visual.locator('.texise-visual-figure').click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-advanced-visual-bibliography.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const firstCell = visual.locator('.texise-visual-table td').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-advanced-visual-bibliography.e2e.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const theoremBody = visual.locator('.texise-visual-theorem-body').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-advanced-visual-bibliography.e2e.ts",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await visual.locator('.texise-visual-inline-citation').click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ai-r10.e2e.ts",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'../fixtures/texise-source-project.zip',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ai-r10.e2e.ts",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "replacements: [{ find: 'Hello TeXise.', replace: 'Hello from TeXise AI.' }],"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ai-r10.e2e.ts",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ai-r10.e2e.ts",
      "line": 49,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const ai = page.getByTestId('texise-ai-overlay');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ai-r10.e2e.ts",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await ai.locator('#texise-ai-provider').selectOption('openai');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ai-r10.e2e.ts",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await ai.getByLabel('Ask TeXise AI…').fill('Change the greeting to mention TeXise AI.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ai-r10.e2e.ts",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(ai.getByTestId('texise-ai-proposal')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ai-r10.e2e.ts",
      "line": 61,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByLabel('LaTeX source editor')).toContainText('Hello TeXise.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ai-r10.e2e.ts",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByLabel('LaTeX source editor')).toContainText('Hello from TeXise AI.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".locator('.texise-visual-paragraph')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 87,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({ timeout: 180_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 88,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({ timeout: 60_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 175,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-latex-visual-editor')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 202,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const pdfScroll = page.getByTestId('texise-pdf-scroll-container');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 218,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'  author = {TeXise},',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 285,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'  author = {TeXise},',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 312,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-latex-visual-editor')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 322,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await selectVisualText(page, '.texise-visual-paragraph', 'command');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 331,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await selectVisualText(page, '.texise-visual-paragraph', 'command');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-20.e2e.ts",
      "line": 396,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-latex-visual-editor').locator('img').first()).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-24-1.e2e.ts",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const preview = page.getByTestId('texise-pdf-preview');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-24-1.e2e.ts",
      "line": 49,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await preview.getByTestId('texise-output-tabs').getByRole('button', { name: /Log/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-24-1.e2e.ts",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const performance = preview.getByTestId('texise-compile-performance');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-24-1.e2e.ts",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(preview.getByTestId('texise-compile-log')).toBeVisible({ timeout: 180_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-certification-r14-24-1.e2e.ts",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await preview.getByTestId('texise-output-tabs').getByRole('button', { name: 'PDF' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'../fixtures/texise-collaboration-full-project.zip',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-user-id', 'anon:e2e-guest');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 41,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-name', 'Guest');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-color', '#2f80ed');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 89,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "throw new Error('Unable to resolve the local TeXise collaboration review test port.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 196,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "throw new Error('Unable to resolve the local TeXise collaboration test port.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 207,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-user-id', 'anon:e2e-host');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 208,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-name', 'Host');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 209,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-color', '#eb5757');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 243,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const guestExplorer = guest.page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 284,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const compileStatus = page.getByTestId('texise-log-status-dot');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 378,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const recoveryEntry = entries.find((entry) => entry.kind === 'file' && entry.path.startsWith('.texise-local-recovery/') && entry.path.endsWith('/main.tex'));"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 414,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-user-id', 'anon:e2e-alice');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 415,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-name', 'Alice');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 416,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-color', '#eb5757');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 419,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-user-id', 'anon:e2e-bob');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 420,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-name', 'Bob');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 421,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-color', '#2f80ed');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 490,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(cleanSource).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 507,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-user-id', 'anon:e2e-alice-track');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 508,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-name', 'Alice');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 509,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-color', '#eb5757');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 512,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-user-id', 'anon:e2e-bob-track');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 513,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-name', 'Bob');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 514,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-color', '#2f80ed');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 569,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(await hostSource.inputValue()).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 577,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "// does not spend 30 minutes here; release certification sets TEXISE_TX7_SOAK=1."
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 579,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "test.skip(process.env.TEXISE_TX7_SOAK !== '1' && process.env.TEXISE_RELEASE_QUALITY !== '1', 'Set TEXISE_TX7_SOAK=1 or run formal release quality for the BF35 collaboration/review soak.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 603,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-user-id', 'anon:e2e-soak-host');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 604,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-name', 'Soak Host');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 605,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "localStorage.setItem('texise-collaboration-color', '#eb5757');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-collaboration-r9.e2e.ts",
      "line": 652,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = guest.page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.cm-texise-review-anchor')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// Review metadata remains in TeXise review storage and never pollutes canonical LaTeX."
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(sourceAfterComment).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-visual-comment-anchor')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.locator('.texise-visual-comment-anchor').first().click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.cm-texise-review-resolved')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.cm-texise-review-point')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(reopenedSource).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 80,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('BF4.1 maps a Visual comment decoration through native TeXise typing', async ({ page }) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 91,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".locator('.texise-latex-visual-editor .texise-visual-paragraph')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 106,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const highlight = page.locator('.texise-visual-comment-anchor').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts",
      "line": 118,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-visual-comment-anchor')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compile-output-r14-22-4.e2e.ts",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const preview = page.getByTestId('texise-pdf-preview');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compile-output-r14-22-4.e2e.ts",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(preview.getByTestId('texise-output-tabs').getByRole('button', { name: 'PDF' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compile-output-r14-22-4.e2e.ts",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(preview.getByTestId('texise-output-tabs').getByRole('button', { name: 'Log' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compile-output-r14-22-4.e2e.ts",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const logPane = preview.getByTestId('texise-compile-log');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compile-output-r14-22-4.e2e.ts",
      "line": 44,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await preview.getByTestId('texise-output-tabs').getByRole('button', { name: 'PDF' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-matrix-r14-24-1.e2e.ts",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-matrix-r14-24-1.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const preview = page.getByTestId('texise-pdf-preview');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-matrix-r14-24-1.e2e.ts",
      "line": 41,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(preview.getByTestId('texise-log-status-dot')).toHaveAttribute("
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-matrix-r14-24-1.e2e.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await preview.getByTestId('texise-output-tabs').getByRole('button', { name: 'PDF' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-matrix-r14-24-1.e2e.ts",
      "line": 84,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const cache = await caches.open('texise-texlive-swiftlatex-r14-7-v1');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-matrix-r14-24-1.e2e.ts",
      "line": 103,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const cache = await caches.open('texise-texlive-swiftlatex-r14-7-v1');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-matrix-r14-24-1.e2e.ts",
      "line": 177,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await preview.getByTestId('texise-output-tabs').getByRole('button', { name: /Log/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-matrix-r14-24-1.e2e.ts",
      "line": 178,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(preview.getByTestId('texise-compile-log')).not.toContainText(/Citation.*undefined/i);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-r14-2.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dialog = page.getByTestId('texise-template-dialog');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-r14-2.e2e.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({ timeout: 120_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-r14-23-biber.e2e.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-r14-23-biber.e2e.ts",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'@book{sample2026,title={Browser Biber},author={Researcher, Ada},year={2026},publisher={TeXise}}',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-r14-23-biber.e2e.ts",
      "line": 43,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const pdfPreview = page.getByTestId('texise-pdf-preview');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-r14-23-biber.e2e.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await pdfPreview.getByTestId('texise-output-tabs').getByRole('button', { name: 'Log' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-r14-23-biber.e2e.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const log = pdfPreview.getByTestId('texise-compile-log');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-compiler-r14-7.e2e.ts",
      "line": 44,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({ timeout: 120_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-controller-mathlive-r14-18.e2e.ts",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('R14.18 Source and Visual share the TeXise MathLive exact-source model', async ({ page }) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-controller-mathlive-r14-18.e2e.ts",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// Cursor-driven TeXise Source preview resolves the shared canonical region."
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-controller-mathlive-r14-18.e2e.ts",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const sourcePreview = page.getByTestId('texise-mathlive-preview');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-controller-mathlive-r14-18.e2e.ts",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-controller-mathlive-r14-18.e2e.ts",
      "line": 78,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-controller-mathlive-r14-18.e2e.ts",
      "line": 79,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = visual.locator('.texise-visual-paragraph').filter({ hasText: 'R14.18 editable paragraph.' });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-core-recovery-r14-14.e2e.ts",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-core-recovery-r14-14.e2e.ts",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-core-recovery-r14-14.e2e.ts",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-latex-visual-editor')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-core-recovery-r14-14.e2e.ts",
      "line": 100,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-core-recovery-r14-14.e2e.ts",
      "line": 102,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Hello Visual Editor.' });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-core-recovery-r14-14.e2e.ts",
      "line": 105,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// Typed slash is owned by the TeXise suggestion plugin; Section is a pure"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-core-recovery-r14-14.e2e.ts",
      "line": 114,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-heading').filter({ hasText: 'Section title' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-core-recovery-r14-14.e2e.ts",
      "line": 119,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const editable = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Hello Visual Editor. Updated' });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-core-recovery-r14-14.e2e.ts",
      "line": 153,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(log).not.toContainText('__texise_synctex__.tex');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-core-recovery-r14-14.e2e.ts",
      "line": 175,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (process.env.TEXISE_RELEASE_QUALITY === '1' || status.compilerProfile === 'full') {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-integrated-r14-10.e2e.ts",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({ timeout: 120_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-integrated-r14-10.e2e.ts",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-integrated-r14-10.e2e.ts",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-integrated-r14-10.e2e.ts",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await visual.locator('.texise-visual-inline-bold').fill('verified');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-integrated-r14-10.e2e.ts",
      "line": 88,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const pdfPreview = page.getByTestId('texise-pdf-preview');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-integrated-r14-10.e2e.ts",
      "line": 94,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(textLayer.locator('.texise-pdf-search-active')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-integrated-r14-10.e2e.ts",
      "line": 142,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-latex-visual-editor')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 50,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "url.searchParams.set('texiseLiveDraftProbe', '1');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "(window as unknown as { __texiseLiveDraftProbe?: unknown })"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".__texiseLiveDraftProbe,"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 65,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".getByTestId('texise-pdf-preview')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 66,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".getByTestId('texise-log-status-dot')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 72,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "__texiseLiveDraftProbe?: {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 90,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ").__texiseLiveDraftProbe;"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 131,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".getByTestId('texise-pdf-preview')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 132,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".getByTestId('texise-log-status-dot')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 144,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "url.searchParams.set('texiseLiveDraftProbe', '1');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 150,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "__texiseLiveDraftProbe?: {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 155,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ").__texiseLiveDraftProbe;"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-draft-r4.e2e.ts",
      "line": 172,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "page.getByTestId('texise-pdf-preview').getByTestId('texise-log-status-dot'),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-pdf-r5.e2e.ts",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const manualStatus = await page.getByTestId('texise-log-status-dot').getAttribute('data-compile-status');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-pdf-r5.e2e.ts",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview')).toContainText('Live PDF · BusyTeX LuaLaTeX');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-pdf-r5.e2e.ts",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(await page.getByTestId('texise-log-status-dot').getAttribute('data-compile-status')).toBe(manualStatus);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-pdf-r5.e2e.ts",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const preview = page.getByTestId('texise-pdf-preview');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-pdf-r5.e2e.ts",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const manualStatus = await page.getByTestId('texise-log-status-dot').getAttribute('data-compile-status');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-pdf-r5.e2e.ts",
      "line": 69,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview')).toContainText('Live PDF · instant');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-pdf-r5.e2e.ts",
      "line": 70,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(await page.getByTestId('texise-log-status-dot').getAttribute('data-compile-status')).toBe(manualStatus);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-live-pdf-r5.e2e.ts",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(await page.getByTestId('texise-log-status-dot').getAttribute('data-compile-status')).toBe(manualStatus);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-local-ai-r14-26-0.e2e.ts",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const launcher = page.getByRole('button', { name: 'Open TeXise AI' });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-local-ai-r14-26-0.e2e.ts",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const overlay = page.getByTestId('texise-ai-overlay');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-local-ai-r14-26-0.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(overlay.getByTestId('texise-paper-memory-foundation')).toContainText('does not upload papers or pretend to index them yet');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-local-ai-r14-26-0.e2e.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await overlay.getByRole('button', { name: 'Close TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-local-ai-r14-26-0.e2e.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await overlay.getByRole('button', { name: 'Close TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-mathlive-r14-8.e2e.ts",
      "line": 121,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'This equation contains structural LaTeX directives that TeXise will not send through MathLive.',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-mobile-pdf-r14-23-1.e2e.ts",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const editorPane = page.getByTestId('texise-editor-pane');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-mobile-pdf-r14-23-1.e2e.ts",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const outputPane = page.getByTestId('texise-output-pane');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-mobile-pdf-r14-23-1.e2e.ts",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const preview = page.getByTestId('texise-pdf-preview');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-mobile-pdf-r14-23-1.e2e.ts",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(preview.getByText('TeXise could not render this PDF page.')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-mobile-pdf-r14-23-1.e2e.ts",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await preview.getByTestId('texise-output-tabs').getByRole('button', { name: /Log/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-mobile-pdf-r14-23-1.e2e.ts",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(preview.getByTestId('texise-compile-log')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ollama-bf51-1.e2e.ts",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ollama-bf51-1.e2e.ts",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const ai = page.getByTestId('texise-ai-overlay');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ollama-bf51-1.e2e.ts",
      "line": 69,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await ai.getByLabel('Ask TeXise AI…').fill('Reply with a short local test response.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ollama-bf51-1.e2e.ts",
      "line": 80,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await ai.getByLabel('Ask TeXise AI…').fill('Reply through Ollama Cloud.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm3-r14-26-3.e2e.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm3-r14-26-3.e2e.ts",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const overlay = page.getByTestId('texise-ai-overlay');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm3-r14-26-3.e2e.ts",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const panel = page.getByTestId('texise-paper-memory');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm3-r14-26-3.e2e.ts",
      "line": 82,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm3-r14-26-3.e2e.ts",
      "line": 83,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByTestId('texise-ai-overlay').getByRole('tab', { name: 'Papers' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm3-r14-26-3.e2e.ts",
      "line": 84,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const reopened = page.getByTestId('texise-paper-memory');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm5-r14-26-3.e2e.ts",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm5-r14-26-3.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByTestId('texise-ai-overlay').getByRole('tab', { name: 'Papers' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm5-r14-26-3.e2e.ts",
      "line": 41,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const panel = page.getByTestId('texise-paper-memory');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm6-r14-26-3.e2e.ts",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm6-r14-26-3.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByTestId('texise-ai-overlay').getByRole('tab', { name: 'Papers' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm6-r14-26-3.e2e.ts",
      "line": 41,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const panel = page.getByTestId('texise-paper-memory');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm7-r14-26-3.e2e.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm7-r14-26-3.e2e.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByTestId('texise-ai-overlay').getByRole('tab', { name: 'Papers' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm7-r14-26-3.e2e.ts",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const panel = page.getByTestId('texise-paper-memory');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm7-r14-26-3.e2e.ts",
      "line": 55,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Close TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm7-r14-26-3.e2e.ts",
      "line": 66,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const overlay = page.getByTestId('texise-ai-overlay');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm7-r14-26-3.e2e.ts",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Close TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm7-r14-26-3.e2e.ts",
      "line": 73,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = page.locator('.texise-latex-visual-editor .texise-visual-paragraph').filter({ hasText: 'Robust local research' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm8-r14-26-3.e2e.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm9-r14-26-3.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm9-r14-26-3.e2e.ts",
      "line": 41,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByTestId('texise-ai-overlay').getByRole('tab', { name: 'Papers' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm9-r14-26-3.e2e.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const panel = page.getByTestId('texise-paper-memory');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm9-r14-26-3.e2e.ts",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm9-r14-26-3.e2e.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByTestId('texise-ai-overlay').getByRole('tab', { name: 'Papers' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-paper-memory-pm9-r14-26-3.e2e.ts",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const reopened = page.getByTestId('texise-paper-memory');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-papers-scale-r29.e2e.ts",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-papers-scale-r29.e2e.ts",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByTestId('texise-ai-overlay').getByRole('tab', { name: 'Papers' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-papers-scale-r29.e2e.ts",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const panel = page.getByTestId('texise-paper-memory');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-papers-scale-r29.e2e.ts",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-papers-scale-r29.e2e.ts",
      "line": 77,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByTestId('texise-ai-overlay').getByRole('tab', { name: 'Papers' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-papers-scale-r29.e2e.ts",
      "line": 78,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-paper-memory')).toContainText('50 papers', { timeout: 20_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-polish-r14-22-6.e2e.ts",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-compiler-indicator')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-polish-r14-23-4.e2e.ts",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const SPLIT_V1 = 'texise:editor-pdf-split:v1';"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-polish-r14-23-4.e2e.ts",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const SPLIT_V2 = 'texise:editor-pdf-split:v2';"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-polish-r14-23-4.e2e.ts",
      "line": 23,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const split = page.getByTestId('texise-split-workspace');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-polish-r14-23-4.e2e.ts",
      "line": 89,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const statusDot = page.getByTestId('texise-log-status-dot');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-polish-r14-23-4.e2e.ts",
      "line": 101,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const outputPane = page.getByTestId('texise-output-pane');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-polish-r14-23-4.e2e.ts",
      "line": 106,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const logButton = page.getByTestId('texise-output-tabs').getByRole('button', { name: /Log/ });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-pro-r11.e2e.ts",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'../fixtures/texise-source-project.zip',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-pro-r11.e2e.ts",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-pro-r11.e2e.ts",
      "line": 20,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const ai = page.getByTestId('texise-ai-overlay');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-pro-r11.e2e.ts",
      "line": 23,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dialog = page.getByTestId('texise-pro-dialog');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-pro-r11.e2e.ts",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await dialog.getByLabel('Licence key').fill('TEXISE-PRO-R11-E2E');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-pro-r11.e2e.ts",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(dialog.getByText('TeXise Pro is active')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-pro-r11.e2e.ts",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-pro-r11.e2e.ts",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const restoredAi = page.getByTestId('texise-ai-overlay');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-pro-r11.e2e.ts",
      "line": 37,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(restoredAi.locator('#texise-ai-provider option[value=\"openai\"]')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-pro-r11.e2e.ts",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pro-dialog')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-professional-r14-24-0.e2e.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-professional-r14-24-0.e2e.ts",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const tools = page.getByTestId('texise-project-tools-dialog');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-professional-r14-24-0.e2e.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(tools.getByTestId('texise-project-text-search')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-professional-r14-24-0.e2e.ts",
      "line": 61,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-project-text-search')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-professional-r14-24-0.e2e.ts",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-project-text-search').locator('select')).toHaveValue('file');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-professional-r14-24-0.e2e.ts",
      "line": 67,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const navigator = page.getByTestId('texise-project-outline');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-project-meaning-r14-26-1.e2e.ts",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const tools = page.getByTestId('texise-project-tools-dialog');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-project-meaning-r14-26-1.e2e.ts",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const meaning = tools.getByTestId('texise-project-meaning-search');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-project-rag-r14-26-2.e2e.ts",
      "line": 56,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "key: `texise:ai:history:v1:${workspaceName}`,"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-project-rag-r14-26-2.e2e.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-project-rag-r14-26-2.e2e.ts",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const overlay = page.getByTestId('texise-ai-overlay');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-project-tools-r8.e2e.ts",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'../fixtures/texise-r7-project.zip',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-project-tools-r8.e2e.ts",
      "line": 56,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-project-tools-r8.e2e.ts",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await visual.locator('.texise-visual-paragraph, .texise-visual-rich-paragraph').first().dblclick();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-project-tools-r8.e2e.ts",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-project-tools-r8.e2e.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-ai-overlay')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-project-tools-r8.e2e.ts",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-references-r14-25-0.e2e.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-research-assistance-r14-25-1.e2e.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-research-assistance-r14-25-1.e2e.ts",
      "line": 177,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "return JSON.parse(localStorage.getItem(`texise:reference-shortlist:v2:${name}`) ?? '[]');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-research-assistance-r14-25-1.e2e.ts",
      "line": 188,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const tools = page.getByTestId('texise-project-tools-dialog');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-research-assistance-r14-25-1.e2e.ts",
      "line": 190,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(tools.getByTestId('texise-research-review')).toContainText('Potential citation gap');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-research-assistance-r14-25-1.e2e.ts",
      "line": 191,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(tools.getByTestId('texise-research-review')).toContainText('Figure has no caption');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-research-assistance-r14-25-1.e2e.ts",
      "line": 192,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(tools.getByTestId('texise-research-review')).toContainText('Figure has no label');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-research-assistance-r14-25-1.e2e.ts",
      "line": 193,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(tools.getByTestId('texise-research-review')).toContainText(/never inserts citations, changes claims, or rewrites LaTeX automatically/i);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-research-terminal-r14-28-0.e2e.ts",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('R14.28.0 terminal shares the TeXise workspace and opens scientific code files', async ({ page }) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const split = page.getByTestId('texise-split-workspace');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const editor = page.getByTestId('texise-editor-pane');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const output = page.getByTestId('texise-output-pane');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-split-workspace')).toHaveAttribute("
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-split-workspace')).toHaveAttribute("
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-split-workspace')).toHaveAttribute("
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 67,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const editorPane = page.getByTestId('texise-editor-pane');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 68,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const outputPane = page.getByTestId('texise-output-pane');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const marker = `texise-editor-${Date.now()}`;"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 78,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-editor-pdf-resizer')).toBeHidden();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 84,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const preview = page.getByTestId('texise-pdf-preview');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 90,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "preview.getByTestId('texise-output-tabs').getByRole('button', { name: 'PDF' }),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 116,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(preview.getByTestId('texise-compile-log')).toBeVisible({ timeout: 180_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-responsive-split-r14-22-5.e2e.ts",
      "line": 117,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(preview.getByTestId('texise-compile-log')).toContainText("
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-review-history-r14-27-2.e2e.ts",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(reviewedSource).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-scientific-runtime-certification-r14-28-12.e2e.ts",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const liveScientific = process.env.TEXISE_SCIENTIFIC_RUNTIME_LIVE === '1';"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-scientific-runtime-certification-r14-28-12.e2e.ts",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const liveCpp = process.env.TEXISE_C_CPP_LIVE === '1';"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-scientific-runtime-certification-r14-28-12.e2e.ts",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await runCommand(page, input, 'runtime doctor', 'TeXise scientific runtime doctor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-scientific-runtime-certification-r14-28-12.e2e.ts",
      "line": 80,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "test.skip(!liveScientific, 'Set TEXISE_SCIENTIFIC_RUNTIME_LIVE=1 to run CDN-backed scientific runtime certification.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-scientific-runtime-certification-r14-28-12.e2e.ts",
      "line": 121,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "test.skip(!liveScientific || !liveCpp, 'Set TEXISE_SCIENTIFIC_RUNTIME_LIVE=1 and TEXISE_C_CPP_LIVE=1 for the Wasmer/Clang gate.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-session-r14-17.e2e.ts",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-session-r14-6.e2e.ts",
      "line": 37,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('[data-texise-latex-view=\"visual\"]')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-session-r14-6.e2e.ts",
      "line": 69,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const heading = page.locator('.texise-visual-heading').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-source-editor.e2e.ts",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'../fixtures/texise-source-project.zip',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-source-editor.e2e.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(source).toContainText('Hello TeXise.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-source-editor.e2e.ts",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'Edited in the TeXise source editor.',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-source-editor.e2e.ts",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(source).toContainText('Hello TeXise.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-source-editor.e2e.ts",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(source).toContainText('Edited in the TeXise source editor.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-source-editor.e2e.ts",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(reloaded).toContainText('Edited in the TeXise source editor.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-source-r14-16.e2e.ts",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "return `\\\\documentclass{article}\\n\\\\begin{document}\\n${'TeXise soft wrapping remains a viewport preference and never rewrites canonical source. '.repeat(40)}\\n\\\\end{document}\\n`;"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-source-r14-16.e2e.ts",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('R14.16 keeps one CodeMirror view while soft wrap toggles and runs the TeXise toolbar', async ({ page }) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-split-scroll-r14-15.e2e.ts",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({ timeout: 180_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-split-scroll-r14-15.e2e.ts",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const split = page.getByTestId('texise-split-workspace');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-split-scroll-r14-15.e2e.ts",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const editorToolbar = page.getByTestId('texise-editor-toolbar');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-split-scroll-r14-15.e2e.ts",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const pdfToolbar = page.getByTestId('texise-pdf-toolbar');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-synctex-r14-22-2.e2e.ts",
      "line": 23,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({ timeout: 180_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-synctex-r14-22-2.e2e.ts",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({ timeout: 120_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-synctex-r14-22-2.e2e.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({ timeout: 180_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-templates-r12.e2e.ts",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dialog = page.getByTestId('texise-template-dialog');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-templates-r12.e2e.ts",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dialog = page.getByTestId('texise-template-dialog');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-templates-r12.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pro-dialog')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-templates-r12.e2e.ts",
      "line": 70,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByText(/Welcome (to TeXise|back!)/)).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.cm-texise-change-replace')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 61,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'A resilient local claim.' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-visual-change-anchor')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const second = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Second visual paragraph.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 82,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.cm-texise-change-insert')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 88,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'Second visual paragraph.' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 91,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// Review history stays in TeXise review storage and never writes metadata into canonical LaTeX."
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 94,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(reviewedSource).not.toContain('TEXISE-REVIEW');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 115,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".locator('.texise-latex-visual-editor .texise-visual-paragraph')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 125,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const deletion = page.locator('.texise-visual-change-deletion-widget').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 135,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-visual-change-deletion-widget')).toContainText('Delete');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 138,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-visual-change-deletion-widget')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-track-changes-r14-27-1.e2e.ts",
      "line": 140,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "page.locator('.texise-latex-visual-editor .texise-visual-paragraph').filter({ hasText: 'Delete this word.' }),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ui-r30.e2e.ts",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ui-r30.e2e.ts",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const shell = page.getByTestId('texise-ai-overlay');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ui-r30.e2e.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const launcher = page.getByRole('button', { name: 'Open TeXise AI' });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ui-r30.e2e.ts",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-ai-overlay')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ui-r30.e2e.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-research-dock')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ui-r30.e2e.ts",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const close = page.getByTestId('texise-ai-overlay').getByRole('button', { name: /close/i }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-ui-r30.e2e.ts",
      "line": 50,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByRole('button', { name: 'Open TeXise AI' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf2-integrity.e2e.ts",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf2-integrity.e2e.ts",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const heading = visual.locator('.texise-visual-heading').filter({ hasText: 'Methods' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf2-integrity.e2e.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const headingParagraph = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Heading paragraph.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf2-integrity.e2e.ts",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const bullet = visual.locator('.texise-visual-list-item').filter({ hasText: 'First bullet' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf2-integrity.e2e.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-list-item').filter({ hasText: 'Second bullet' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf2-integrity.e2e.ts",
      "line": 65,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const numbered = visual.locator('.texise-visual-list-item').filter({ hasText: 'First number' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf2-integrity.e2e.ts",
      "line": 70,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-list-item').filter({ hasText: 'Second number' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('BF4 gives Visual paragraphs headings lists and hard breaks native TeXise caret behavior', async ({ page }) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 26,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// Heading Enter is owned by TeXise. The very next keystroke must type into"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const heading = visual.locator('.texise-visual-heading').filter({ hasText: 'Methods' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'Native heading paragraph.' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// Repeated Enter remains inside the same TeXise view and the final caret is"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Existing paragraph.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'After rapid Enter.' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// The caret may be at the END of a word. Native TeXise list Enter must still"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 49,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const firstItem = visual.locator('.texise-visual-list-item').filter({ hasText: 'First bullet' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 56,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-list-item').filter({ hasText: 'Second bullet' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-list-item').filter({ hasText: 'Third bullet' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// Native TeXise indentation and outdent must leave this as the same logical"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// Empty-item Enter exits the list exactly as TeXise does."
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 69,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'After list exit.' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 73,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const hardBreak = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Hard break target.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 98,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 99,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Start' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 130,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 131,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const start = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Start' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 186,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 187,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const cells = visual.locator('.texise-visual-table td');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 202,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'After table.' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 225,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 226,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const equation = visual.locator('.texise-visual-math-display').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 228,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(equation).toHaveClass(/texise-visual-math-protected/u);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 251,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'After equation.' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 266,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('BF4.1 simple table controls mutate TeXise structure and keep the LaTeX column spec synchronized', async ({ page }) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 289,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 290,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const table = visual.locator('.texise-visual-table').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 318,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'After table controls.' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 356,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 357,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-figure')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 358,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-protected-table')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 359,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-raw-block').filter({ hasText: 'tikzpicture' })).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 360,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-figure')).toContainText('Experimental result');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 361,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-protected-table')).toContainText('Preserved exactly');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 363,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const before = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Before.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 367,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const after = visual.locator('.texise-visual-paragraph').filter({ hasText: 'After.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 387,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = page.locator('.texise-latex-visual-editor .texise-visual-paragraph').filter({ hasText: 'Alpha' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 402,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('BF4.2 manuscript focus is borderless and the TeXise gutter handle remains clickable across the hover corridor', async ({ page }) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 410,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 425,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Hover target.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 461,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 462,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const rawBlock = visual.locator('.texise-visual-raw-block[data-visual-kind=\"raw\"]').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 468,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const complexTable = visual.locator('.texise-visual-protected-table').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 500,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 501,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const table = visual.locator('.texise-visual-table').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 507,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.locator('.texise-visual-native-table-toolbar .texise-visual-table-actions-summary').click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 530,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 531,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Insert below.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 545,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const figure = visual.locator('.texise-visual-figure').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 574,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 575,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const beta = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Beta.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 583,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'Beta. still here' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 584,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'Alpha. still here' })).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 586,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const items = visual.locator('.texise-visual-list-item');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 594,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test(\"BF4.3 empty paragraph shows the TeXise slash placeholder\", async ({ page }) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 601,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = page.locator('.texise-latex-visual-editor .texise-visual-paragraph').filter({ hasText: 'Alpha' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 605,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-latex-visual-editor [data-placeholder=\"Press \\'/\\' for commands\"]')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 615,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 617,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const trigger = page.locator('.texise-visual-table-actions-summary');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 634,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const protectedBlock = page.locator('.texise-latex-visual-editor [data-immutable=\"true\"]').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 644,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('BF4.3 TeXise block drag moves PM content and never inserts the old sentinel text', async ({ page }) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 651,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 652,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const first = visual.locator('.texise-visual-paragraph').filter({ hasText: 'First block.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 653,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const second = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Second block.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 660,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual).not.toContainText('texise-bf4-block');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 663,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(value).not.toContain('texise-bf4-block');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 711,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 712,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-document-setup')).toContainText('\\\\documentclass{article}');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 713,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-math-display')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 714,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-figure')).toContainText('Complex figure · Protected LaTeX');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 721,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Editable paragraph before math.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 730,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-document-setup')).toContainText('\\\\def\\\\x');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 731,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-math-display')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 732,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-figure')).toContainText('\\\\begin{figure}[htb]');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 734,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-raw-block').filter({ hasText: '\\\\begin{equation}' })).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 761,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "source: 'texise-tikz-draw',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts",
      "line": 775,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-editability-r14-22.e2e.ts",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-editability-r14-22.e2e.ts",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "(window as typeof window & { __texiseVisualRoot?: Element }).__texiseVisualRoot = element;"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-editability-r14-22.e2e.ts",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Editable paragraph.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-editability-r14-22.e2e.ts",
      "line": 44,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const heading = visual.locator('.texise-visual-heading').filter({ hasText: 'Heading' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-editability-r14-22.e2e.ts",
      "line": 50,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const listText = visual.locator('.texise-visual-list-item').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-editability-r14-22.e2e.ts",
      "line": 56,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const firstCell = visual.locator('.texise-visual-table td').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-editability-r14-22.e2e.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "(window as typeof window & { __texiseVisualRoot?: Element }).__texiseVisualRoot === element,"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'../fixtures/texise-r7-project.zip',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// TeXise-style: hovering the left edge is enough to surface +. No block click first."
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = visual.locator('.texise-visual-paragraph').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await visual.locator('.texise-visual-figure').click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// Select a cell, then use the compact TeXise-style structure menu relative to that cell."
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const firstCell = visual.locator('.texise-visual-table td').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 49,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await visual.locator('.texise-visual-table-actions-summary').click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await visual.locator('.texise-visual-table-meta-button').click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await visual.locator('.texise-visual-inline-reference').first().click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 90,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 91,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Start' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 100,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const firstCell = visual.locator('.texise-visual-table td').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 104,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const lastCell = visual.locator('.texise-visual-table td').last();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-interaction-r14-23-3.e2e.ts",
      "line": 110,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "visual.locator('.texise-visual-paragraph').filter({ hasText: 'After table.' }),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-pdf-r14-4.e2e.ts",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-pdf-r14-4.e2e.ts",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({ timeout: 120_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-pdf-r14-4.e2e.ts",
      "line": 66,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(textLayer.locator('.texise-pdf-search-active')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 26,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('R14.11 Visual mode restores TeXise slash menu, plus handle, drag grip and selection toolbar', async ({ page }) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// Original TeXise-style left + opens the same Visual slash menu."
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const firstBlock = visual.locator('.texise-visual-paragraph').filter({ hasText: 'First block.' });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-heading').filter({ hasText: 'Section title' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const formattingParagraph = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Visual formatting target.' });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 68,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-list-item')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 70,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// Text selection gets the TeXise-style floating formatting bubble, but the"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 72,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await selectText(page, '.texise-visual-paragraph', 'formatting');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-inline-bold')).toContainText('formatting');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 80,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const refreshedFirst = visual.locator('.texise-visual-paragraph').filter({ hasText: 'First block.' });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-11.e2e.ts",
      "line": 81,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const refreshedFormatting = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Visual' });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-12-p0.e2e.ts",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-12-p0.e2e.ts",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const twoBody = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Two body.' });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-12-p0.e2e.ts",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'Two body.' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-12-p0.e2e.ts",
      "line": 44,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const oneHeading = visual.locator('.texise-visual-heading').filter({ hasText: 'One' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-12-p0.e2e.ts",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const twoHeading = visual.locator('.texise-visual-heading').filter({ hasText: 'Two' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-13.e2e.ts",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-13.e2e.ts",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const paragraph = visual.locator('.texise-visual-paragraph').filter({ hasText: text }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-13.e2e.ts",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-13.e2e.ts",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-13.e2e.ts",
      "line": 88,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "visual.locator('.texise-visual-paragraph').filter({ hasText: 'After equation.' }),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-13.e2e.ts",
      "line": 107,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await selectText(page, '.texise-visual-paragraph', 'Link this phrase');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-9.e2e.ts",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-9.e2e.ts",
      "line": 37,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-inline-raw')).toContainText('\\\\custommacro{LOCKED}');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-9.e2e.ts",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-inline-bold')).toHaveText('important');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-9.e2e.ts",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-inline-italic').first()).toHaveText('emphasised');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-9.e2e.ts",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-list-item')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-9.e2e.ts",
      "line": 41,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-raw')).toContainText('KEEP-RAW-CONTENT');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-9.e2e.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'Editable after environment.' })).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-9.e2e.ts",
      "line": 44,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await visual.locator('.texise-visual-inline-bold').fill('critical');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-r14-9.e2e.ts",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const firstItem = visual.locator('.texise-visual-list-item').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'../fixtures/texise-source-project.zip',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 35,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const outline = page.getByTestId('texise-project-outline');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 41,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-raw')).toContainText('KEEP-RAW-CONTENT');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 43,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const heading = visual.locator('.texise-visual-heading').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 85,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 168,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 180,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-math-display')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 181,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-list-item')).toHaveCount(2);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 182,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-table')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 194,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-math-display')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 195,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-list-item')).toHaveCount(2);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 196,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-table')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 250,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 269,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const source = element.querySelector<HTMLElement>('.texise-visual-protected-source');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-semantic.e2e.ts",
      "line": 298,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(await node.locator('.texise-visual-protected-source').textContent()).not.toBe('');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-hard-break')).toHaveCount(4);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".locator('.texise-visual-paragraph')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-synthetic-paragraph')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "visual.locator('.texise-visual-paragraph').filter({ hasText: 'Second paragraph.' }),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const firstItem = visual.locator('.texise-visual-list-item').filter({ hasText: 'First item' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 49,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-list-item')).toHaveCount(2);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-synthetic-paragraph')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "visual.locator('.texise-visual-paragraph').filter({ hasText: 'After list.' }),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const lineOne = visual.locator('.texise-visual-paragraph').filter({ hasText: 'Line one.' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-synthetic-inline')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 65,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-hard-break')).toHaveCount(6);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 66,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-synthetic-inline')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "visual.locator('.texise-visual-paragraph').filter({ hasText: 'Line three.' }),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 79,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const bold = visual.locator('.texise-visual-inline-bold').filter({ hasText: 'bold text' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 86,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-hard-break')).toHaveCount(7);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 133,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = page.locator('.texise-latex-visual-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 134,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await visual.locator('.texise-visual-list-item').first().click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 135,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await visual.locator('.texise-visual-list-actions-summary').click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 137,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-list-item')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/latex-visual-structure-r14-23-2.e2e.ts",
      "line": 139,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(visual.locator('.texise-visual-paragraph').filter({ hasText: 'Replacement paragraph.' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/native-fs-recovery.e2e.ts",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const request = indexedDB.open('texise-db');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/native-fs-recovery.e2e.ts",
      "line": 104,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'TeXise has not changed your workspace entry or files.',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/native-fs-rename-fallback.e2e.ts",
      "line": 156,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const request = indexedDB.open('texise-db');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/native-fs-rename-fallback.e2e.ts",
      "line": 216,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/nativefs-external-refresh.e2e.ts",
      "line": 182,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "/** Simulates switching to another app window and focusing TeXise again. */"
    },
    {
      "path": "packages/tooling/e2e-tests/src/nativefs-external-refresh.e2e.ts",
      "line": 230,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/nativefs-external-refresh.e2e.ts",
      "line": 255,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// structural re-list even though the TeXise tab stayed visible throughout."
    },
    {
      "path": "packages/tooling/e2e-tests/src/nativefs-external-refresh.e2e.ts",
      "line": 432,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/nativefs-external-refresh.e2e.ts",
      "line": 615,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".getByTestId('texise-file-explorer')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/nativefs-external-refresh.e2e.ts",
      "line": 674,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".getByTestId('texise-file-explorer')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/nativefs-external-refresh.e2e.ts",
      "line": 683,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ".getByTestId('texise-file-explorer')"
    },
    {
      "path": "packages/tooling/e2e-tests/src/note-relocation.e2e.ts",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/note-relocation.e2e.ts",
      "line": 180,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const explorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pro-license-fixture.ts",
      "line": 23,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const signingInput = `texise1.${encodedPayload}`;"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pro-license-fixture.ts",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: 'Open TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pro-license-fixture.ts",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const ai = page.getByTestId('texise-ai-overlay');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pro-license-fixture.ts",
      "line": 55,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dialog = page.getByTestId('texise-pro-dialog');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pro-license-fixture.ts",
      "line": 56,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await dialog.getByLabel('Licence key').fill('TEXISE-PRO-E2E-TEST');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pro-license-fixture.ts",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByText('TeXise Pro is active').waitFor();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pro-license-fixture.ts",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await ai.getByRole('button', { name: 'Close TeXise AI' }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/project-cross-browser-r14-10.e2e.ts",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "test.skip(process.env.TEXISE_RELEASE_QUALITY !== '1', 'Cross-browser portability is a release-certification gate.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/project-cross-browser-r14-10.e2e.ts",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(firefoxPage.getByTestId('texise-pdf-preview').locator('canvas')).toBeVisible({ timeout: 120_000 });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/project-zip.e2e.ts",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'Portable TeXise project content.',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/project-zip.e2e.ts",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(source).toContainText('Portable TeXise project content.');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/project-zip.e2e.ts",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'Portable TeXise project content.',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/public-compare-polish.e2e.ts",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByRole('heading', { level: 1, name: 'TeXise vs Bibby AI' })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/public-compare-polish.e2e.ts",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-faq-list')).toHaveCount(1);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/public-compare-polish.e2e.ts",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-public-faq-list')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/public-compare-polish.e2e.ts",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByText('Choose TeXise if…')).toHaveCount(0);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/public-compare-polish.e2e.ts",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const texiseTick = page.locator('.texise-compare-texise .texise-compare-tick').first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/public-compare-polish.e2e.ts",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(texiseTick).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/public-compare-polish.e2e.ts",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const background = await texiseTick.evaluate((node) => getComputedStyle(node).backgroundColor);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/public-compare-polish.e2e.ts",
      "line": 41,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(fitLabel).toHaveClass(/texise-compare-fit-label/u);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/public-compare-polish.e2e.ts",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(fitLabel).not.toHaveClass(/texise-eyebrow/u);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/public-compare-polish.e2e.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const docs = [{ id: 1, slug: 'ollama', title: 'Ollama', category: 'AI', excerpt: 'Use Ollama with TeXise.' }];"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pwa-install.e2e.ts",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Object.assign(window, { __texiseTestPwaPrompted: true });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pwa-install.e2e.ts",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(manifest.name).toBe('TeXise');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pwa-install.e2e.ts",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(manifest.short_name).toBe('TeXise');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pwa-install.e2e.ts",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "protocol: 'web+texise',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pwa-install.e2e.ts",
      "line": 91,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: /TeXise/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pwa-install.e2e.ts",
      "line": 152,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: /TeXise/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pwa-install.e2e.ts",
      "line": 176,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "`web+texise://open?hash=${encodeURIComponent(hashRoute)}`,"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pwa-install.e2e.ts",
      "line": 192,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: /TeXise/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pwa-install.e2e.ts",
      "line": 237,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// The actual protocol launch (web+texise://) needs a real installed PWA and"
    },
    {
      "path": "packages/tooling/e2e-tests/src/pwa-install.e2e.ts",
      "line": 251,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByRole('button', { name: /TeXise/ })).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-general.e2e.ts",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: /TeXise/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-general.e2e.ts",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: /TeXise/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-general.e2e.ts",
      "line": 116,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "__texiseTestBeforeInstallPromptPrevented: event.defaultPrevented,"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-general.e2e.ts",
      "line": 126,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: /TeXise/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-general.e2e.ts",
      "line": 139,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Object.assign(window, { __texiseTestPwaPrompted: true });"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-general.e2e.ts",
      "line": 146,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "__texiseTestBeforeInstallPromptPrevented: event.defaultPrevented,"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-general.e2e.ts",
      "line": 155,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'Add TeXise to this device and open it in its own app window.',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-general.e2e.ts",
      "line": 167,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "__texiseTestPwaPrompted?: boolean;"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-general.e2e.ts",
      "line": 169,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ").__texiseTestPwaPrompted,"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-general.e2e.ts",
      "line": 180,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "__texiseTestBeforeInstallPromptPrevented?: boolean;"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-general.e2e.ts",
      "line": 182,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": ").__texiseTestBeforeInstallPromptPrevented,"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-recovery.e2e.ts",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: /TeXise/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-workspaces.e2e.ts",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: /TeXise/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-workspaces.e2e.ts",
      "line": 214,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const request = indexedDB.open('texise-db');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-workspaces.e2e.ts",
      "line": 275,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "id: 'texise-locate-workspace',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/settings-workspaces.e2e.ts",
      "line": 304,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const request = indexedDB.open('texise-db');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/sidebar-links.e2e.ts",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('the sidebar footer exposes only the TeXise homepage link', async ({ page }) => {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/sidebar-links.e2e.ts",
      "line": 5,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.context().route('https://www.texise.com/', (route) =>"
    },
    {
      "path": "packages/tooling/e2e-tests/src/sidebar-links.e2e.ts",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "route.fulfill({ body: '<title>TeXise</title>', contentType: 'text/html' }),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/sidebar-links.e2e.ts",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: /TeXise/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/simple-workspace-creation-worflow.e2e.ts",
      "line": 55,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const fileExplorer = page.getByTestId('texise-file-explorer');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/simple-workspace-creation-worflow.e2e.ts",
      "line": 65,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: /TeXise/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/simple-workspace-creation-worflow.e2e.ts",
      "line": 109,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.getByRole('button', { name: /TeXise/ }).click();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/stale-tab.e2e.ts",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const channel = new BroadcastChannel('texise_io_channel');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "email: 'admin@texise.test',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 40,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "provenance: 'texise',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 120,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const editor = page.locator('.texise-admin-template-editor');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 122,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(editor.getByAltText('Default TeXise template thumbnail')).toHaveAttribute("
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 124,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'/texise-template-default-thumbnail.webp',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 127,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const thumbnailInput = editor.locator('.texise-admin-template-thumbnail-upload input[type=\"file\"]');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 143,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(editor.getByAltText('Default TeXise template thumbnail')).toHaveAttribute("
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 145,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'/texise-template-default-thumbnail.webp',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 157,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "author: 'TeXise',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 176,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.route('**/texise-templates/templates.json', (route) => json(route, 200, {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 198,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const custom = page.locator('.texise-template-card').filter({ hasText: 'Custom Thumbnail' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 199,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const fallback = page.locator('.texise-template-card').filter({ hasText: 'Fallback Thumbnail' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 200,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(custom.locator('.texise-template-card-preview-link > img')).toHaveAttribute("
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 204,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(fallback.locator('.texise-template-card-preview-link > img')).toHaveAttribute("
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 206,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'/texise-template-default-thumbnail.webp',"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 209,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const aspectRatio = await fallback.locator('.texise-template-card-preview-link > img').evaluate("
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 222,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.route('**/texise-templates/templates.json', (route) => json(route, 200, {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 232,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const card = page.locator('.texise-template-card').filter({ hasText: 'PDF And Thumbnail' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 233,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(card.locator('.texise-template-card-preview-link > img')).toHaveAttribute("
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 239,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.getByRole('dialog').locator('.texise-template-pdfjs')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 241,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-template-detail .texise-template-pdfjs')).toBeVisible();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 246,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await page.route('**/texise-templates/templates.json', (route) => json(route, 200, {"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 256,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const firstCard = page.locator('.texise-template-card').filter({ hasText: 'Card 1' }).first();"
    },
    {
      "path": "packages/tooling/e2e-tests/src/template-thumbnail-hotfix10.e2e.ts",
      "line": 270,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await expect(page.locator('.texise-template-featured-grid .texise-template-card')).toHaveCount(4);"
    },
    {
      "path": "packages/tooling/e2e-tests/src/translations-locale.e2e.ts",
      "line": 43,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "expect(locales[0]).not.toContain('__TEXISE_LOCALE_VERSION__');"
    },
    {
      "path": "packages/tooling/e2e-tests/src/workspace-fixture-loading.e2e.ts",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "__texiseFixtureHandlerExecuted: false,"
    },
    {
      "path": "packages/tooling/e2e-tests/src/workspace-fixture-loading.e2e.ts",
      "line": 55,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "__texiseFixtureIframeExecuted: false,"
    },
    {
      "path": "packages/tooling/e2e-tests/src/workspace-fixture-loading.e2e.ts",
      "line": 56,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "__texiseFixtureScriptExecuted: false,"
    },
    {
      "path": "packages/tooling/e2e-tests/src/workspace-fixture-loading.e2e.ts",
      "line": 132,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Reflect.get(globalThis, '__texiseFixtureScriptExecuted'),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/workspace-fixture-loading.e2e.ts",
      "line": 133,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Reflect.get(globalThis, '__texiseFixtureHandlerExecuted'),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/workspace-fixture-loading.e2e.ts",
      "line": 134,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Reflect.get(globalThis, '__texiseFixtureIframeExecuted'),"
    },
    {
      "path": "packages/tooling/e2e-tests/src/workspace-fixture-loading.e2e.ts",
      "line": 147,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'<script>globalThis.__texiseFixtureScriptExecuted = true</script>',"
    },
    {
      "path": "packages/tooling/env-vars/index.ts",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const RELEASE_VERSION = process.env.TEXISE_RELEASE_VERSION || releaseVersion;"
    },
    {
      "path": "packages/tooling/env-vars/index.ts",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TEXISE_HOT_ENABLED = process.env.TEXISE_HOT;"
    },
    {
      "path": "packages/tooling/env-vars/index.ts",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const APP_ENV_OVERRIDE = process.env.TEXISE_APP_ENV?.trim();"
    },
    {
      "path": "packages/tooling/env-vars/index.ts",
      "line": 72,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "throw new Error(`Invalid TEXISE_APP_ENV: ${APP_ENV_OVERRIDE}`);"
    },
    {
      "path": "packages/tooling/env-vars/index.ts",
      "line": 111,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "__TEXISE_BUILD_TIME_CONFIG__: string;"
    },
    {
      "path": "packages/tooling/env-vars/index.ts",
      "line": 131,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const hot = Boolean(TEXISE_HOT_ENABLED);"
    },
    {
      "path": "packages/tooling/env-vars/index.ts",
      "line": 132,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const texiseBuildConfig = new TexiseConfig({"
    },
    {
      "path": "packages/tooling/env-vars/index.ts",
      "line": 158,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "texiseBuildConfig.print();"
    },
    {
      "path": "packages/tooling/env-vars/index.ts",
      "line": 173,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "__TEXISE_BUILD_TIME_CONFIG__: JSON.stringify(texiseBuildConfig.serialize()),"
    },
    {
      "path": "packages/tooling/env-vars/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/tooling/env-vars/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/tooling/env-vars/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/tooling/mobile-entry/README.md",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "Expo (React Native) shell for the TeXise iOS/Android app. The entire"
    },
    {
      "path": "packages/tooling/mobile-entry/README.md",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "- Milestone M0 (current): the WebView loads `https://www.texise.com` (or"
    },
    {
      "path": "packages/tooling/mobile-entry/README.md",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`EXPO_PUBLIC_TEXISE_WEB_URL`). Notes persist in IndexedDB inside the app's"
    },
    {
      "path": "packages/tooling/mobile-entry/README.md",
      "line": 20,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "`com.texise.app.dev`, `com.texise.app.preview`, `com.texise.app`"
    },
    {
      "path": "packages/tooling/mobile-entry/README.md",
      "line": 64,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`EXPO_PUBLIC_TEXISE_WEB_URL=http://<your-lan-ip>:5173 pnpm dev:client`."
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "appName: 'TeXise Dev',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "scheme: 'texise-dev',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "iosBundleIdentifier: 'com.texise.app.dev',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 18,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "androidPackage: 'com.texise.app.dev',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "appName: 'TeXise Preview',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 22,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "scheme: 'texise-preview',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "iosBundleIdentifier: 'com.texise.app.preview',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 24,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "androidPackage: 'com.texise.app.preview',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "appName: 'TeXise',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "scheme: 'texise',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 29,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "iosBundleIdentifier: 'com.texise.app',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 30,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "androidPackage: 'com.texise.app',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 50,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TEXISE_WEB_URL ="
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 51,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "process.env['EXPO_PUBLIC_TEXISE_WEB_URL'] ??"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "'https://www.texise.com';"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "slug: 'texise',"
    },
    {
      "path": "packages/tooling/mobile-entry/app.config.ts",
      "line": 81,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texiseWebUrl: TEXISE_WEB_URL,"
    },
    {
      "path": "packages/tooling/mobile-entry/package.json",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/tooling/mobile-entry/src/__tests__/webview-navigation.spec.ts",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const productionUrl = 'https://www.texise.com';"
    },
    {
      "path": "packages/tooling/mobile-entry/src/__tests__/webview-navigation.spec.ts",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'https://www.texise.com/notes?view=all#today',"
    },
    {
      "path": "packages/tooling/mobile-entry/src/__tests__/webview-navigation.spec.ts",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'https://www.texise.com:443/notes',"
    },
    {
      "path": "packages/tooling/mobile-entry/src/__tests__/webview-navigation.spec.ts",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "getWebViewNavigationAction('http://app.texise.com/notes', productionUrl),"
    },
    {
      "path": "packages/tooling/mobile-entry/src/__tests__/webview-navigation.spec.ts",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'https://www.texise.com:8443/notes',"
    },
    {
      "path": "packages/tooling/mobile-entry/src/__tests__/webview-navigation.spec.ts",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'https://evil.example\\\\@app.texise.com/notes',"
    },
    {
      "path": "packages/tooling/mobile-entry/src/__tests__/webview-navigation.spec.ts",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'https://user@app.texise.com/notes',"
    },
    {
      "path": "packages/tooling/mobile-entry/src/__tests__/webview-navigation.spec.ts",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'https://www.texise.com:65536/notes',"
    },
    {
      "path": "packages/tooling/mobile-entry/src/app.tsx",
      "line": 20,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "const FALLBACK_WEB_URL = 'https://www.texise.com';"
    },
    {
      "path": "packages/tooling/mobile-entry/src/app.tsx",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "extra && typeof extra['texiseWebUrl'] === 'string'"
    },
    {
      "path": "packages/tooling/mobile-entry/src/app.tsx",
      "line": 26,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "? extra['texiseWebUrl']"
    },
    {
      "path": "packages/tooling/mobile-entry/src/app.tsx",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* Thin shell around the TeXise web app. Everything user-facing lives in"
    },
    {
      "path": "packages/tooling/mobile-entry/src/app.tsx",
      "line": 72,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "<Text style={styles.errorTitle}>Could not load TeXise</Text>"
    },
    {
      "path": "packages/tooling/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texiseWorkspaceConfig\": {"
    },
    {
      "path": "packages/tooling/plop-configs/package.json",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/tooling/plop-configs/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/tooling/plop-configs/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/tooling/storybook/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/tooling/storybook/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"url\": \"https://www.texise.com/support.html\""
    },
    {
      "path": "packages/tooling/storybook/package.json",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/tooling/storybook/package.json",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"storybook\": \"storybook dev --port ${TEXISE_STORYBOOK_PORT:-6006}\""
    },
    {
      "path": "packages/tooling/storybook/src/stories/wordgard-plus-toolbar.stories.tsx",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "* with zero TeXise application imports inside the demoed packages. The editor is created"
    },
    {
      "path": "packages/tooling/test-utils/markdown-corpus.ts",
      "line": 1246,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "markdown: 'before[[texise.com]]after',"
    },
    {
      "path": "packages/tooling/test-utils/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/tooling/test-utils/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/tooling/test-utils/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/tooling/test-utils/scripts/generate-markdown-spec-corpus.ts",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "* byte-for-byte. Set `TEXISE_SPEC_CORPUS_DIR` to a directory containing"
    },
    {
      "path": "packages/tooling/test-utils/scripts/generate-markdown-spec-corpus.ts",
      "line": 95,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const localDir = process.env.TEXISE_SPEC_CORPUS_DIR;"
    },
    {
      "path": "packages/tooling/test-utils/test-command-handler.ts",
      "line": 2,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "import { type TexiseAppCommand, texiseAppCommands } from '@learnitive/commands';"
    },
    {
      "path": "packages/tooling/test-utils/test-command-handler.ts",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "commands = texiseAppCommands,"
    },
    {
      "path": "packages/tooling/test-utils/test-service-setup.ts",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "import { type TexiseAppCommand, texiseAppCommands } from '@learnitive/commands';"
    },
    {
      "path": "packages/tooling/test-utils/test-service-setup.ts",
      "line": 132,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "commands = texiseAppCommands,"
    },
    {
      "path": "packages/ui/base-ui/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"description\": \"Base UI-backed shadcn components for TeXise\","
    },
    {
      "path": "packages/ui/base-ui/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/ui/base-ui/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/ui/base-ui/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/ui/base-ui/src/dropdown-menu.tsx",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// `Menu.Group`/`Menu.RadioGroup`. TeXise uses dropdown labels standalone, so"
    },
    {
      "path": "packages/ui/package.json",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texiseWorkspaceConfig\": {"
    },
    {
      "path": "packages/ui/ui-components/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/ui/ui-components/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/ui/ui-components/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "packages/ui/ui-components/src/app-sidebar.tsx",
      "line": 424,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "className=\"texise-compile-primary w-full justify-center gap-2 font-semibold\""
    },
    {
      "path": "packages/ui/ui-components/src/app-sidebar.tsx",
      "line": 437,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "title = 'TeXise',"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree-icons.ts",
      "line": 3,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TEXISE_FILE_ICON_SPRITE = `"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree-icons.ts",
      "line": 5,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<symbol id=\"texise-file-icon-markdown\" viewBox=\"0 0 16 16\">"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree-icons.ts",
      "line": 9,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "<symbol id=\"texise-file-icon-texise\" viewBox=\"0 0 16 16\">"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree-icons.ts",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const TEXISE_PIERRE_FILE_TREE_ICONS = {"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree-icons.ts",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Notes are Markdown, so ship only the custom TeXise icons instead of loading"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree-icons.ts",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "spriteSheet: TEXISE_FILE_ICON_SPRITE,"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree-icons.ts",
      "line": 22,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "md: 'texise-file-icon-markdown',"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree-icons.ts",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "markdown: 'texise-file-icon-markdown',"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree-icons.ts",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'texise.md': 'texise-file-icon-texise',"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree-icons.ts",
      "line": 27,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'readme.md': 'texise-file-icon-markdown',"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree.tsx",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "import { TEXISE_PIERRE_FILE_TREE_ICONS } from './pierre-file-tree-icons';"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree.tsx",
      "line": 57,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "button[data-type='item'][data-item-path$='/.texise-empty-directory'] {"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree.tsx",
      "line": 75,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const EMPTY_DIRECTORY_SENTINEL = '.texise-empty-directory';"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree.tsx",
      "line": 140,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// Because TeXise drives the tree imperatively from Jotai state, any note"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree.tsx",
      "line": 475,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "icons: TEXISE_PIERRE_FILE_TREE_ICONS,"
    },
    {
      "path": "packages/ui/ui-components/src/file-tree/pierre-file-tree.tsx",
      "line": 656,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "data-testid=\"texise-file-explorer\""
    },
    {
      "path": "packages/ui/ui-components/src/sidebar.tsx",
      "line": 67,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// TeXise drives the desktop open state through Jotai atoms, so this provider is"
    },
    {
      "path": "packages/ui/ui-components/src/sidebar.tsx",
      "line": 70,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "// and its keyboard shortcut are owned by TeXise's command system."
    },
    {
      "path": "packages/ui/ui-components/src/workspace-dialog.stories.tsx",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"Store notes in your browser's storage. Suitable for trying out TeXise, but notes may be lost if browser storage is cleared.\","
    },
    {
      "path": "packages/ui/ui-misc/package.json",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"homepage\": \"https://www.texise.com\","
    },
    {
      "path": "packages/ui/ui-misc/package.json",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"bugs\": \"https://www.texise.com/support.html\","
    },
    {
      "path": "packages/ui/ui-misc/package.json",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "non-runtime source/reference",
      "text": "\"texisePackageConfig\": {"
    },
    {
      "path": "plans/009-mobile-ios-expo-shell.md",
      "line": 61,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "default `https://app.bangle.io`, overridable via `EXPO_PUBLIC_TEXISE_WEB_URL`"
    },
    {
      "path": "plans/AUTONOMOUS_EXECUTION_HANDOFF.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# Autonomous TeXise Execution and Chat Handoff Rule"
    },
    {
      "path": "plans/AUTONOMOUS_EXECUTION_HANDOFF.md",
      "line": 3,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "This rule applies to TeXise implementation work whenever there are remaining phases after the current task begins."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 4,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Ship one cumulative BF51 release on top of BF50.23/R6 that improves search authority, comparison pages, Bing favicon/indexing, Ollama/local-AI choice, AI robustness, and Live PDF observability without breaking existing TeXise editor/compiler/storage/collaboration/export behavior."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Configurable Free project limit (`TEXISE_FREE_PLAN_LIMIT`, default 5)."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "2. Canonical TeXise public product facts."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "Phase 20–21 release certification and packaging. BF51 feature implementation is complete in `/mnt/data/texise_bf51_work/public_html`; final dependency-free validation is green except for historical failures reproduced unchanged in the BF50.23 baseline. Packaging is the remaining local phase."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 103,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Comparison claims no longer hard-code the Free-plan default project count. `TEXISE_FREE_PLAN_LIMIT` remains authoritative at runtime."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 104,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- IndexNow supports optional `TEXISE_INDEXNOW_URLS_FILE` changed-URL manifests while preserving the canonical fallback and non-fatal deployment behavior."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 105,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- BF51.1 app-shell identity is `texise-app-shell-r14-28-20-buildfix51-1-v1`; production dist coherency parsing supports point-build cache identities."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 154,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- `TEXISE_OLLAMA_MODEL=<local-model> pnpm run release:ollama-local`."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 160,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Ollama remains a browser→user-computer integration; no TeXise-server Ollama runtime is introduced."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 163,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- If Ollama is unreachable, TeXise falls back to the last configured BYOK AI profile when Privacy Mode is off; otherwise it fails closed."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 170,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Server architecture remains browser→user Ollama; no TeXise server Ollama daemon/proxy."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 176,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Added public `/api/change-log` returning published events newest-first and resolving the configurable `{{TEXISE_FREE_PLAN_LIMIT}}` token."
    },
    {
      "path": "plans/BF51_GROWTH_AI_SEARCH_IMPLEMENTATION_LEDGER.md",
      "line": 181,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Added BF51.4 app-shell identity `texise-app-shell-r14-28-20-buildfix51-4-v1` and cumulative installer/deployment/release-quality guard wiring."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 1,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "# TeXise Autonomous Roadmap Ledger"
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Baseline: user-supplied `texise-saas-r14.28.20-bf50-configurable-free-project-limit-fix37-public_html.zip`; TeXpile reference: user-supplied `texpile-master.zip`."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "- Verification: `scripts/bf50-live-pdf-r6-regression.test.mjs` 3/3 PASS; `scripts/repair-buildfix50-source.mjs .` PASS; `scripts/texise-release-audit.mjs` 388/388 PASS after R6 contract addition; modified TS/TSX syntax-transpile sweep PASS. Runtime hardening has no R6-introduced failures; its five failures are reproduced unchanged in the uploaded baseline and concern legacy AI-label expectations."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Authoritative R11 input: `texise-r14.28.12-r11-claim-evidence-public_html.zip`"
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Later cumulative implementation baseline: `texise-r14.28.12-r23-r29-public_html.zip`"
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Admin: no universal bootstrap password; explicit interactive `texise-saas admin-create`; exact historical `admin/admin` upgrade credential is revoked with its sessions; secure existing administrators are preserved; admin throttling is DB-backed by IP/account."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Structure/rejoin: project structure seals at Host readiness; same-room local divergence is copied into `.texise-local-recovery/<timestamp>/...` using snapshot hash baselines before authoritative rematerialisation."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 75,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Removed live machinery: TeXise custom cursor/selection positions, authorship CRDT/decorations, Visual collaboration, Follow/Open, current mode/file awareness, shared review maps and live file-tree operation CRDTs."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 86,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Baseline: uploaded `texise-saas-r14.28.14-buildfix30-join-loader-aria-progress-publichtml-final(1).zip`, SHA-256 `b3999b2b4698ed096cd81b549765b6eab0c93af3d7c8d891321731cc45d22c30`."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 157,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- `/var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3` operational audit without manuscript/prompt/answer/API-key content."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 165,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- BusyTeX source instrumentation uses reserved `__texise_live__/` wrapper/probe files; canonical user source is never instrumented in place."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 175,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- `node scripts/texise-release-audit.mjs`: **314/314 passed**."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 195,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "- Deployment upgrades preserve `/etc/texise/texise.env`."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 198,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Status: implementation complete in `/mnt/data/texise_r6_work/public_html`; dependency-free certification complete. Provisioned dependency/browser certification remains an external deployment gate."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 199,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Objective: make eligible LaTeX prose edits appear in the PDF pane before the existing R5 full Live PDF reconciliation, using TeXpile's warm/incremental preview architecture as a reference without replacing or weakening any TeXise compile, SyncTeX, collaboration, AI, editor, export, storage or cloud-fallback behavior."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 214,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Ollama: remote/cloud-backed models exposed through localhost are explicitly detected and blocked from TeXise local-service AI. Selected models are revalidated through `/api/tags` + `/api/show` before manuscript context is sent. No automatic Ollama→BYOK fallback exists."
    },
    {
      "path": "plans/texise-autonomous-progress.md",
      "line": 231,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "- Ollama is installed/run only by the user on their computer; the TeXise server has no Ollama dependency."
    },
    {
      "path": "scripts/ai-nextgen-regression.test.mjs",
      "line": 37,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(ai, /const CLOUD_CREDENTIAL_DB = 'texise-ai-credentials-v1'/u);"
    },
    {
      "path": "scripts/ai-nextgen-regression.test.mjs",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(writing, /\\.texise\\/reviews\\/review-/u);"
    },
    {
      "path": "scripts/ai-nextgen-regression.test.mjs",
      "line": 181,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(chat, /data-testid=\"texise-ai-settings\"/u);"
    },
    {
      "path": "scripts/ai-nextgen-regression.test.mjs",
      "line": 195,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts'),"
    },
    {
      "path": "scripts/ai-nextgen-regression.test.mjs",
      "line": 222,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(dialog, /Review artifacts intentionally live below hidden `\\.texise\\/`/u);"
    },
    {
      "path": "scripts/bf50-ai-ui-simplification-fix33-regression.test.mjs",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(events, /AI_SETTINGS_OPEN_EVENT = 'texise:open-ai-settings'/u);"
    },
    {
      "path": "scripts/bf50-ai-ui-simplification-fix33-regression.test.mjs",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(chat, /data-testid=\"texise-ai-settings\"/u);"
    },
    {
      "path": "scripts/bf50-ai-ui-simplification-fix33-regression.test.mjs",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(settings, /When enabled, TeXise reviews the manuscript line/u);"
    },
    {
      "path": "scripts/bf50-free-project-limit-fix37-regression.test.mjs",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/config/texise.env.example'),"
    },
    {
      "path": "scripts/bf50-free-project-limit-fix37-regression.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/bf50-free-project-limit-fix37-regression.test.mjs",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(envExample, /TEXISE_FREE_PLAN_LIMIT=5/u);"
    },
    {
      "path": "scripts/bf50-free-project-limit-fix37-regression.test.mjs",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /texise_ensure_env_default \"\\$\\{env_file\\}\" TEXISE_FREE_PLAN_LIMIT '5'/u);"
    },
    {
      "path": "scripts/bf50-free-project-limit-fix37-regression.test.mjs",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.equal(loadTexiseConfig({ TEXISE_PUBLIC_URL: 'https://www.texise.com', TEXISE_SAAS_ENABLED: '0' }).freePlanProjectLimit, 5);"
    },
    {
      "path": "scripts/bf50-free-project-limit-fix37-regression.test.mjs",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.equal(loadTexiseConfig({ TEXISE_PUBLIC_URL: 'https://www.texise.com', TEXISE_SAAS_ENABLED: '0', TEXISE_FREE_PLAN_LIMIT: '3' }).freePlanProjectLimit, 3);"
    },
    {
      "path": "scripts/bf50-free-project-limit-fix37-regression.test.mjs",
      "line": 66,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(migrations, /\\{\\{TEXISE_FREE_PLAN_LIMIT\\}\\}/u);"
    },
    {
      "path": "scripts/bf50-free-project-limit-fix37-regression.test.mjs",
      "line": 67,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(router, /replaceAll\\('\\{\\{TEXISE_FREE_PLAN_LIMIT\\}\\}', String\\(config\\?\\.freePlanProjectLimit \\|\\| 5\\)\\)/u);"
    },
    {
      "path": "scripts/bf50-live-pdf-r6-regression.test.mjs",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(compiler, /__texise_live_instant__\\.tex/);"
    },
    {
      "path": "scripts/bf50-live-pdf-r6-regression.test.mjs",
      "line": 41,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(compiler, /__texise_live_instant_warm__\\.tex/);"
    },
    {
      "path": "scripts/bf50-pdf-mouse-selection-fix36-regression.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-pdf-text-layer :is\\(span, br\\) \\{[\\s\\S]*position: absolute;/);"
    },
    {
      "path": "scripts/bf50-pdf-mouse-selection-fix36-regression.test.mjs",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-pdf-text-layer :is\\(span, br\\) \\{[\\s\\S]*white-space: pre;/);"
    },
    {
      "path": "scripts/bf50-pdf-mouse-selection-fix36-regression.test.mjs",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-pdf-text-layer :is\\(span, br\\) \\{[\\s\\S]*user-select: text;/);"
    },
    {
      "path": "scripts/bf50-pdf-mouse-selection-fix36-regression.test.mjs",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-pdf-text-layer :is\\(span, br\\) \\{[\\s\\S]*transform-origin: 0 0;/);"
    },
    {
      "path": "scripts/bf50-pricing-docs-editor-ux-regression.test.mjs",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'Up to {{TEXISE_FREE_PLAN_LIMIT}} owned projects', 'Unlimited local and cloud compiles', 'Joining invited collaborations',"
    },
    {
      "path": "scripts/bf50-pricing-docs-editor-ux-regression.test.mjs",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'PDF export with a TeXise watermark', 'Start and host live collaborations',"
    },
    {
      "path": "scripts/bf50-pricing-docs-editor-ux-regression.test.mjs",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'Starting a collaboration requires sign-in and Pro', 'TeXise does not provide a default server-funded user-writing AI key',"
    },
    {
      "path": "scripts/bf50-pricing-docs-editor-ux-regression.test.mjs",
      "line": 50,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/config/texise.env.example'),"
    },
    {
      "path": "scripts/bf50-pricing-docs-editor-ux-regression.test.mjs",
      "line": 60,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(config, /TEXISE_FREE_PLAN_LIMIT/u);"
    },
    {
      "path": "scripts/bf50-pricing-docs-editor-ux-regression.test.mjs",
      "line": 61,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(envExample, /TEXISE_FREE_PLAN_LIMIT=5/u);"
    },
    {
      "path": "scripts/bf50-pricing-docs-editor-ux-regression.test.mjs",
      "line": 68,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(marketing, /PDF export — TeXise watermark/u);"
    },
    {
      "path": "scripts/bf50-pricing-docs-editor-ux-regression.test.mjs",
      "line": 127,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(preview, /className=\"textLayer texise-pdf-text-layer[^\"]*select-text/u);"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('Fix12 replaces all four Explore TeXise workflow illustrations with the supplied artwork', async () => {"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['packages/tooling/browser-entry/public/texise-editor.webp', '3482af6c13ffb5dbc4cfd480289f4b3bba88c2a89ced77985fbc0c4d2bf9d91d'],"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['packages/tooling/browser-entry/public/texise-lab.webp', '96f6d180b2ff1e46bd022377fbde566bbff3a139a94258783787db99ecf3c6d7'],"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['packages/tooling/browser-entry/public/texiser.webp', 'c802b4945ff3d64260dffa5c79238c5bee68bc34b26c0d837924e2b8ee55051f'],"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['packages/tooling/browser-entry/public/texise-research.webp', '0bb5e2c2866b4a2a9a54d7b7154956efc64ee962ff0a11089da7524ec151be82'],"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(marketing, /texise-pricing-auth-note/u);"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-pricing-auth-note \\{ font-size: \\.72rem; line-height: 1\\.45; \\}/u);"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 37,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-about-page \\.texise-eyebrow \\{ font-family: var\\(--texise-font-ui\\); \\}/u);"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-blog-article-prose ul \\{ list-style-type: disc; \\}/u);"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-blog-article-prose ol \\{ list-style-type: decimal; \\}/u);"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-blog-article-prose li \\{ display: list-item;/u);"
    },
    {
      "path": "scripts/bf50-public-ai-polish-fix12-regression.test.mjs",
      "line": 51,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(writing, /Never output \\[TEXISE_END\\] or any \\[TEXISE_\\*\\] marker/u);"
    },
    {
      "path": "scripts/blog-docs-responsive-layout-regression.test.mjs",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "/\\.texise-blog-article-prose\\s*\\{[\\s\\S]*?max-width:\\s*68rem;[\\s\\S]*?margin-inline:\\s*auto;/u,"
    },
    {
      "path": "scripts/blog-docs-responsive-layout-regression.test.mjs",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "/\\.texise-blog-article-prose\\s*>\\s*:where\\([^)]*\\)\\s*\\{\\s*max-width:\\s*58rem;/u,"
    },
    {
      "path": "scripts/blog-docs-responsive-layout-regression.test.mjs",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "/\\.texise-blog-article-content \\.texise-prev-next\\s*\\{[^}]*max-width:\\s*68rem;[^}]*margin:\\s*clamp\\([^;]+\\) auto 0;/u,"
    },
    {
      "path": "scripts/blog-docs-responsive-layout-regression.test.mjs",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "/\\.texise-docs-index,\\s*\\n\\s*\\.texise-docs-layout\\s*\\{\\s*grid-template-columns:\\s*minmax\\(0, 1fr\\);\\s*\\}/u,"
    },
    {
      "path": "scripts/blog-docs-responsive-layout-regression.test.mjs",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "/\\.texise-docs-article,\\s*\\n\\s*\\.texise-docs-results\\s*\\{\\s*width:\\s*100%;\\s*max-width:\\s*none;\\s*min-width:\\s*0;\\s*\\}/u,"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const stage = await mkdtemp(path.join(os.tmpdir(), 'texise-bf44-runtime-'));"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SOURCE_ROOT: process.cwd(),"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_TEMPLATE_ROOT: templateRoot,"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_TEMPLATE_PUBLIC_COPY: publicCopy,"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const stage = await mkdtemp(path.join(os.tmpdir(), 'texise-bf44-sync-'));"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/systemd/texise.service'),"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 59,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_TEMPLATE_ROOT=.*TEXISE_SITE_ROOT.*templates/u);"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 60,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_TEMPLATE_PUBLIC_COPY=.*TEXISE_DIST_DIR.*texise-templates/u);"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 61,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_prepare_template_runtime_permissions\\(\\)/u);"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 62,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_template_runtime_health_check\\(\\)/u);"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(unit, /ReadWritePaths=.*\\/var\\/www\\/texise\\.com\\/templates .*\\/dist\\/texise-templates/u);"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 65,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(install, /texise_prepare_template_runtime_permissions/u);"
    },
    {
      "path": "scripts/buildfix44-runtime-template-regression.test.mjs",
      "line": 66,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(upgrade, /texise_prepare_template_runtime_permissions/u);"
    },
    {
      "path": "scripts/buildfix45-apache-root-regression.test.mjs",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const apache = await read('deploy/apache/texise.com-https.conf');"
    },
    {
      "path": "scripts/buildfix45-apache-root-regression.test.mjs",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(apache, /<Directory \"\\/var\\/www\\/texise\\.com\\/public_html\\/dist\">[\\s\\S]*DirectoryIndex index\\.html/u);"
    },
    {
      "path": "scripts/buildfix45-apache-root-regression.test.mjs",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(apache, /RewriteRule \\^\\$ http:\\/\\/127\\.0\\.0\\.1:3100\\/__texise\\/render\\/ \\[P,L,NE\\]/u);"
    },
    {
      "path": "scripts/buildfix45-apache-root-regression.test.mjs",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const rootRule = apache.indexOf('RewriteRule ^$ http://127.0.0.1:3100/__texise/render/ [P,L,NE]');"
    },
    {
      "path": "scripts/buildfix45-apache-root-regression.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const genericRule = apache.indexOf('RewriteRule ^(.*)$ http://127.0.0.1:3100/__texise/render/$1 [P,L,NE]');"
    },
    {
      "path": "scripts/buildfix45-apache-root-regression.test.mjs",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(apache.includes('RewriteRule ^/?index\\\\.html$ https://www.texise.com/ [R=301,L,NE]'));"
    },
    {
      "path": "scripts/buildfix45-apache-root-regression.test.mjs",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/buildfix45-apache-root-regression.test.mjs",
      "line": 20,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /if ! texise_frontend_request '\\/'/u);"
    },
    {
      "path": "scripts/buildfix45-apache-root-regression.test.mjs",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /if ! texise_frontend_request '\\/about'/u);"
    },
    {
      "path": "scripts/buildfix45-apache-root-regression.test.mjs",
      "line": 26,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/buildfix45-apache-root-regression.test.mjs",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /TeXise frontend route diagnostics follow:/u);"
    },
    {
      "path": "scripts/buildfix46-template-preview-home-regression.test.mjs",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('BF50 homepage preserves BF46 template preview behavior while restoring the approved TeXise workflow showcase', async () => {"
    },
    {
      "path": "scripts/buildfix46-template-preview-home-regression.test.mjs",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(hero, /TeXise — Privacy First Research/u);"
    },
    {
      "path": "scripts/buildfix46-template-preview-home-regression.test.mjs",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(marketing, /TeXise vs Overleaf/u);"
    },
    {
      "path": "scripts/buildfix46-template-preview-home-regression.test.mjs",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-why-card/u);"
    },
    {
      "path": "scripts/buildfix46-template-preview-home-regression.test.mjs",
      "line": 20,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-home-workflow-card/u);"
    },
    {
      "path": "scripts/buildfix46-template-preview-home-regression.test.mjs",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /TemplatePdfPreview|texise-template-pdf-preview/u);"
    },
    {
      "path": "scripts/buildfix47-template-directory-regression.test.mjs",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const config = { webRoot: root, publicUrl: 'https://www.texise.com' };"
    },
    {
      "path": "scripts/buildfix47-template-directory-regression.test.mjs",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const manifest = JSON.parse(await read('texise-templates/templates.json'));"
    },
    {
      "path": "scripts/buildfix47-template-directory-regression.test.mjs",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const institutions = JSON.parse(await read('texise-templates/institutions.json'));"
    },
    {
      "path": "scripts/buildfix47-template-directory-regression.test.mjs",
      "line": 19,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "assert.ok(demos.every((item) => item.provenance === 'texise'));"
    },
    {
      "path": "scripts/buildfix47-template-directory-regression.test.mjs",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(sitemap, /https:\\/\\/www\\.texise\\.com\\/templates\\/categories\\/theses-and-dissertations/u);"
    },
    {
      "path": "scripts/buildfix47-template-directory-regression.test.mjs",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(sitemap, /https:\\/\\/www\\.texise\\.com\\/templates\\/institutions\\/unsw/u);"
    },
    {
      "path": "scripts/buildfix47-template-directory-regression.test.mjs",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const institutions = JSON.parse(await read('texise-templates/institutions.json'));"
    },
    {
      "path": "scripts/buildfix48-template-ux-reliability-regression.test.mjs",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(css.includes('.texise-admin-institution-logo'));"
    },
    {
      "path": "scripts/buildfix49-sidebar-projects-branding-regression.test.mjs",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['packages/tooling/browser-entry/public/texise-icons/app-icon-180.png', ['b2a5a74e77c8fafac0512788f2a4b6949521ae27f19495cbe7629ca420b55f49', 180]],"
    },
    {
      "path": "scripts/buildfix49-sidebar-projects-branding-regression.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['packages/tooling/browser-entry/public/texise-icons/app-icon-192.png', ['9f0f6bb40e512bc4c864688979351321448db42b8cf9fc429f55e6a4181adf6d', 192]],"
    },
    {
      "path": "scripts/buildfix49-sidebar-projects-branding-regression.test.mjs",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "['packages/tooling/browser-entry/public/texise-icons/app-icon-512.png', ['d70d02fbabf3accaca63061bafbbd53698b320495ad0c570325afdd34439dc0d', 512]],"
    },
    {
      "path": "scripts/buildfix49-sidebar-projects-branding-regression.test.mjs",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(uiSidebar, /className=\"texise-compile-primary w-full justify-center gap-2 font-semibold\"/u);"
    },
    {
      "path": "scripts/buildfix49-sidebar-projects-branding-regression.test.mjs",
      "line": 44,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const menuStart = app.indexOf('className=\"texise-import-popover\"', importIndex);"
    },
    {
      "path": "scripts/buildfix49-sidebar-projects-branding-regression.test.mjs",
      "line": 66,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('supplied TeXise app icons replace the previous icon bytes at every PWA size', async () => {"
    },
    {
      "path": "scripts/buildfix49-sidebar-projects-branding-regression.test.mjs",
      "line": 69,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.equal(sha256(bytes), expectedHash, `${path} must be the supplied TeXise icon`);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('About is a first-class editorial page and uses the supplied TeXise team image', async () => {"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const image = await stat(new URL('../packages/tooling/browser-entry/public/texise-team.webp', import.meta.url));"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /src=\"\\/texise-team\\.webp\"/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "for (const phrase of ['Our mission', 'Why we built TeXise', 'The team', 'Local first & transparent by design', 'Get in touch']) assert.match(app, new RegExp(phrase.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'u'));"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-about-team-image/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-about-values/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, />TeXise Team<\\/h2>/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-about-page :is\\(h1, h2, h3\\),[\\s\\S]*\\.texise-about-page \\.texise-eyebrow \\{ font-family: var\\(--texise-font-display\\); \\}/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-about-contact \\.texise-button \\{ font-family: var\\(--texise-font-display\\); \\}/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const config = { publicUrl: 'https://www.texise.com' };"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(about.title, /About TeXise/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 38,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "assert.match(apply.title, /Apply a TeXise Pro License/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 47,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "assert.match(app, /texise-apply-license-blurred/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 51,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "assert.match(css, /\\.texise-apply-license-blurred[^}]*pointer-events:\\s*none/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 52,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "assert.match(css, /\\.texise-apply-license-blurred[^}]*filter:\\s*blur\\(/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-apply-login-button[^}]*background:\\s*var\\(--texise-yellow\\)/u);"
    },
    {
      "path": "scripts/buildfix50-about-apply-regression.test.mjs",
      "line": 82,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(pricing, /Already purchased TeXise Pro\\?/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(hero, /TeXise — Privacy First Research/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('BF50.2 features page uses the approved two-column TeXise card design and tall desktop hero is vertically balanced', async () => {"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 44,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(marketing, /texise-features-card-grid/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 45,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(marketing, /texise-feature-card-v2/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-features-card-grid\\s*\\{[\\s\\S]*grid-template-columns: repeat\\(2, minmax\\(0, 1fr\\)\\)/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 49,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /@media \\(min-width: 1070px\\) and \\(min-height: 851px\\)[\\s\\S]*\\.texise-home-hero-inner\\s*\\{[\\s\\S]*justify-content: center/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 50,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-product-comparison \\.texise-section-heading > h2[\\s\\S]*font-family: var\\(--texise-font-display\\)/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 51,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "assert.match(workflows, /TeXiser helps researchers shape ideas into polished scientific documents/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 56,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('BF50.3 Explore TeXise uses concise matched copy rhythm and pricing/comparison refinements', async () => {"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 69,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "'TeXiser helps researchers shape ideas into polished scientific documents, supporting LaTeX drafting, clearer structure, stronger presentation and focused writing while keeping researchers in control.',"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 70,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'TeXise Lab keeps scientific computing beside your manuscript, with local and cloud terminals for Python, R, C/C++, Git, LaTeX utilities and command-line workflows together.',"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'TeXise Research turns papers into usable research context, helping you ask grounded questions, compare methods, find evidence, revisit results and review manuscript with context.',"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 72,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'TeXise Editor combines Source and Visual editing, letting you manage equations, citations, tables, figures, references and complex LaTeX projects from the same underlying files.',"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 80,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(workflows, /className=\"texise-home-workflow-secondary texise-home-workflow-capabilities\"/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 81,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-home-workflow-copy h3\\s*\\{[\\s\\S]*font-size: clamp\\(2rem, 4vw, 3rem\\)/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 82,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-product-comparison \\.texise-section-heading\\s*\\{[\\s\\S]*padding-bottom: clamp\\(2\\.25rem, 4\\.5vw, 3\\.5rem\\)/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 83,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-product-comparison-table\\s*\\{\\s*margin-top: 0;/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 103,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /'\\/features': \\['Features', 'Explore TeXise features for LaTeX writing/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 105,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /'\\/features': \\{[\\s\\S]*?title: 'Features \\| TeXise'/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 123,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "\"'Join collaborations'\", \"'Full collaborations'\", \"'PDF export — TeXise watermark'\", \"'PDF export — no watermark'\","
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 134,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(comparison, /TeXise vs Overleaf/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 136,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(comparison, /texise-compare-check/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 140,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(comparison, /choose <strong>Import ZIP<\\/strong> in TeXise/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 180,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(pdf, /TeXise · Free/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 189,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/config/texise.env.example'),"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 190,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 193,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(config, /TEXISE_PRO_MONTHLY_SHOP/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 195,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(env, /TEXISE_PRO_MONTHLY_SHOP=/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 196,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_PRO_MONTHLY_SHOP/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 215,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "for (const title of ['TeXise for Researchers', 'TeXise for Thesis Writers', 'TeXise for Research Teams', 'Reproducible Research', 'Paper Memory for Research', 'Local AI for LaTeX']) assert.ok(app.includes(`title:'${title}'`), `missing concise use-case title ${title}`);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 216,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "for (const label of ['The goal', 'The friction', 'How TeXise helps', 'What to do next']) assert.ok(app.includes(label), `missing editorial use-case section ${label}`);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 217,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-use-case-detail-v2/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 218,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-use-case-context/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 219,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-use-case-help/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 225,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-product-comparison-table \\.texise-compare-table :is\\(th, td\\):nth-child\\(2\\),[\\s\\S]*:nth-child\\(3\\)[\\s\\S]*text-align: center;[\\s\\S]*vertical-align: middle;/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 239,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 256,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-product-comparison \\.texise-section-heading > h2\\s*\\{[\\s\\S]*margin-bottom: \\.95rem;/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 257,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-compare-detail-table \\.texise-compare-table :is\\(th, td\\):nth-child\\(2\\),[\\s\\S]*nth-child\\(3\\)[\\s\\S]*text-align: center;/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 261,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(iconGenerator, /TeXise Lucide category icon sprite/u);"
    },
    {
      "path": "scripts/buildfix50-public-site-redesign-regression.test.mjs",
      "line": 262,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(deploy.indexOf('node scripts/generate-lucide-category-assets.mjs') < deploy.indexOf('texise_pnpm run lint:ci'), 'generated Lucide SVGs must be refreshed before Biome lint');"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 15,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "const directory = await mkdtemp(join(tmpdir(), 'texise-bf50-license-'));"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 26,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TEXISE_LICENSE_KEYS_FILE: licensePath,"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_PRIVATE_KEY: privatePath,"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_PUBLIC_KEY: publicPath,"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_REFRESH_KEY: refreshPath,"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 43,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const shell = '<!doctype html><html><head><!-- TEXISE_SEO_START --><title>old</title><!-- TEXISE_SEO_END --></head><body><div id=\"root\"></div></body></html>';"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 61,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "author: 'TeXise',"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 70,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "{ publicUrl: 'https://www.texise.com', webRoot: '/unused' },"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 89,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const fromShop = loadTexiseConfig({ TEXISE_SHOP: 'https://payhip.com/b/mVT0' });"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 97,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const customCheckout = loadTexiseConfig({ TEXISE_SHOP: 'https://shop.example.test/texise-pro' });"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 98,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.equal(customCheckout.payhipProductLink, 'https://shop.example.test/texise-pro');"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 102,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "test('BF50 valid Payhip v2 license succeeds when TEXISE_SHOP is a full Payhip URL', async () => {"
    },
    {
      "path": "scripts/buildfix50-quality-blog-payhip-regression.test.mjs",
      "line": 105,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SHOP: 'https://payhip.com/b/mVT0',"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_TEMPLATE_ROOT=\"\\$\\{TEXISE_TEMPLATE_ROOT:-\\$\\{TEXISE_SITE_ROOT\\}\\/templates\\}\"/u);"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_prepare_persistent_template_library\\(\\)/u);"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_sync_persistent_template_source_mirror\\(\\)/u);"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /--root=\"\\$\\{TEXISE_TEMPLATE_ROOT\\}\"/u);"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 14,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /--public-copy=\"\\$\\{TEXISE_SOURCE_ROOT\\}\\/packages\\/tooling\\/browser-entry\\/public\\/texise-templates\"/u);"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /\\.texise-template-library-initialized/u);"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /legacy_config_root=\"\\$\\{TEXISE_SITE_ROOT\\}\\/template-config\"/u);"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/systemd/texise.service'),"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 31,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(library, /TEXISE_TEMPLATE_CONFIG_ROOT|mirrorPersistentAdminConfig|PERSISTENT_ADMIN_CONFIG_FILES/u);"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(unit, /ReadWritePaths=.*\\/var\\/www\\/texise\\.com\\/templates .*\\/dist\\/texise-templates/u);"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 34,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "assert.ok(!app.includes('/var/www/texise.com/templates/{form.tier}/{selectedSlug}/template.json')); // Shared Admin UI must not expose a production host path."
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/buildfix50-template-persistent-root-regression.test.mjs",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/buildfix50-template-staging-regression.test.mjs",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const root = await mkdtemp(path.join(os.tmpdir(), 'texise-template-staging-'));"
    },
    {
      "path": "scripts/buildfix50-template-staging-regression.test.mjs",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const target = path.join(root, 'public_html', 'texise-templates');"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 23,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/config/texise.env.example'),"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 26,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('texise-services/cloud-compile/server.js'),"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_CLOUD_COMPILE_IMAGE 'texlive\\/texlive:latest' 'texlive\\/texlive:latest-full'/u);"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 44,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(config, /TEXISE_CLOUD_COMPILE_FREE_FALLBACK/u);"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 70,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(panel, /Cloud Compile uses TeXise’s isolated Docker TeX Live environment\\./u);"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 75,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(panel, /temporarily sent to TeXise’s isolated Docker compiler/u);"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 82,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 85,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_is_http_url/u);"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 86,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /repaired TEXISE_BUSY_TEXLIVE_ENDPOINT/u);"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 87,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /repaired TEXISE_TEXLIVE_REMOTE_URL/u);"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 138,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('texise-services/cloud-compile/server.js'),"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 139,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/systemd/texise-latex-compile.service'),"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 140,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 148,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_CLOUD_COMPILE_ENABLED[\\s\\S]{0,220}TEXISE_CLOUD_COMPILE_FREE_FALLBACK/u);"
    },
    {
      "path": "scripts/buildfix50-texlive-full-fallback-regression.test.mjs",
      "line": 154,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('texise-services/cloud-compile/server.js'),"
    },
    {
      "path": "scripts/buildfix51-1-production-hardening-regression.test.mjs",
      "line": 91,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /data-texise-prerender=\"compare-detail\"/u);"
    },
    {
      "path": "scripts/buildfix51-1-production-hardening-regression.test.mjs",
      "line": 92,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /data-texise-prerender=\"compare-guide\"/u);"
    },
    {
      "path": "scripts/buildfix51-1-production-hardening-regression.test.mjs",
      "line": 101,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/buildfix51-1-production-hardening-regression.test.mjs",
      "line": 112,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(sw, /texise-app-shell-r14-28-20-buildfix51-(?:2|3|4)-v1/u);"
    },
    {
      "path": "scripts/buildfix51-1-production-hardening-regression.test.mjs",
      "line": 115,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(await read('scripts/submit-indexnow.mjs'), /TEXISE_INDEXNOW_URLS_FILE/u);"
    },
    {
      "path": "scripts/buildfix51-1-production-hardening-regression.test.mjs",
      "line": 124,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seoProduction, /data-texise-prerender/u, 'production SEO verification must require substantive comparison initial HTML');"
    },
    {
      "path": "scripts/buildfix51-2-texposit-ollama-regression.test.mjs",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(service, /spawn\\([^\\n]*ollama|exec\\([^\\n]*ollama/iu, 'TeXise server/service layer must not launch Ollama');"
    },
    {
      "path": "scripts/buildfix51-2-texposit-ollama-regression.test.mjs",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(migrations, /ollama create texise-academic/u);"
    },
    {
      "path": "scripts/buildfix51-2-texposit-ollama-regression.test.mjs",
      "line": 75,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(migrations, /OLLAMA_ORIGINS=https:\\/\\/www\\.texise\\.com/u);"
    },
    {
      "path": "scripts/buildfix51-2-texposit-ollama-regression.test.mjs",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(migrations, /nothing needs to be installed on the TeXise server/u);"
    },
    {
      "path": "scripts/buildfix51-2-texposit-ollama-regression.test.mjs",
      "line": 84,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/buildfix51-2-texposit-ollama-regression.test.mjs",
      "line": 90,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(sw, /texise-app-shell-r14-28-20-buildfix51-(?:2|3|4)-v1/u);"
    },
    {
      "path": "scripts/buildfix51-3-ollama-cloud-regression.test.mjs",
      "line": 53,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(migrations, /The TeXise server never runs or proxies Ollama/u);"
    },
    {
      "path": "scripts/buildfix51-3-ollama-cloud-regression.test.mjs",
      "line": 72,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/buildfix51-3-ollama-cloud-regression.test.mjs",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/buildfix51-3-ollama-cloud-regression.test.mjs",
      "line": 78,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(sw, /texise-app-shell-r14-28-20-buildfix51-(?:3|4)-v1/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /data-texise-prerender=\"change-log\"/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 54,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(production, /verify_html '\\/change-log' change-log 'data-texise-prerender=\"change-log\"'/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 61,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 67,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(sw, /texise-app-shell-r14-28-20-buildfix51-4-v1/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 88,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 93,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_RUNTIME_NEXT\\}\\/server\\/compare-content\\.json/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 138,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /texise-page-container texise-change-log-page/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 139,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /texise-change-log-heading/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 140,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /texise-change-log-timeline/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 141,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /texise-change-log-event/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 142,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /texise-change-log-date/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 143,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /texise-change-log-card/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 144,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /texise-prose/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 145,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /data-texise-prerender-shell/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 146,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /data-texise-prerender-shell hidden aria-hidden=\"true\"/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 147,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(seo, /texise-prerender-visibility/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 148,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(css, /texise-prerender-visibility/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 149,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-change-log-page\\{/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 150,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-change-log-card\\{/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 163,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(marketing, /texise-public-faq-list/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 165,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(marketing.includes('<PublicFaq title={`TeXise vs ${item.name} FAQs`}'));"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 167,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(marketing, /Choose TeXise if/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 170,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(marketing, /texise-compare-fit-label/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 171,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(marketing, /<span className=\"texise-eyebrow\">\\{priority\\}<\\/span>/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 172,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-compare-back \\{[\\s\\S]*display: flex;[\\s\\S]*width: fit-content;/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 173,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(marketing, /texise-compare-tick/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 174,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-compare-status \\.texise-compare-tick[\\s\\S]*background: var\\(--texise-yellow\\)/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 177,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(content, /competitorBest|texiseBest/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 178,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(seo, /Choose TeXise if|One-minute verdict|How we compare/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 192,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /a\\[href='https:\\/\\/ollama\\.com\\/download'\\][\\s\\S]*background: var\\(--texise-yellow\\)/u);"
    },
    {
      "path": "scripts/buildfix51-4-change-log-regression.test.mjs",
      "line": 209,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const planSection = marketing.slice(marketing.indexOf('export const TEXISE_PRICING_PLANS'), marketing.indexOf('export const TEXISE_PLAN_COMPARISON'));"
    },
    {
      "path": "scripts/buildfix51-growth-ai-search-regression.test.mjs",
      "line": 44,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.equal(row.length, 3, `${competitor.slug} capability rows must contain label, TeXise, competitor`);"
    },
    {
      "path": "scripts/buildfix51-growth-ai-search-regression.test.mjs",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/buildfix51-growth-ai-search-regression.test.mjs",
      "line": 107,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(migrations, /Using Ollama with TeXise/u);"
    },
    {
      "path": "scripts/buildfix51-growth-ai-search-regression.test.mjs",
      "line": 108,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(migrations, /OLLAMA_ORIGINS=https:\\/\\/www\\.texise\\.com/u);"
    },
    {
      "path": "scripts/buildfix51-growth-ai-search-regression.test.mjs",
      "line": 112,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(seo, /Local AI, Ollama & BYOK AI for LaTeX \\| TeXise/u);"
    },
    {
      "path": "scripts/buildfix51-growth-ai-search-regression.test.mjs",
      "line": 118,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/buildfix51-growth-ai-search-regression.test.mjs",
      "line": 119,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/buildfix51-growth-ai-search-regression.test.mjs",
      "line": 130,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_frontend_redirect_health_check '\\/latex-templates' 'https:\\/\\/www\\.texise\\.com\\/templates'/u);"
    },
    {
      "path": "scripts/buildfix51-growth-ai-search-regression.test.mjs",
      "line": 131,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_indexnow_key_health_check/u);"
    },
    {
      "path": "scripts/busytex-runtime-compat.test.mjs",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const directory = await mkdtemp(join(tmpdir(), 'texise-busytex-abi-'));"
    },
    {
      "path": "scripts/check-cloud-compile-worker.mjs",
      "line": 3,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const workerUrl = process.env.TEXISE_CLOUD_COMPILE_WORKER_URL || 'http://127.0.0.1:3001/api/compile';"
    },
    {
      "path": "scripts/check-cloud-compile-worker.mjs",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const secret = process.env.TEXISE_CLOUD_COMPILE_WORKER_SECRET || '';"
    },
    {
      "path": "scripts/check-cloud-compile-worker.mjs",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const allowedEngines = String(process.env.TEXISE_CLOUD_COMPILE_ALLOWED_ENGINES || 'pdflatex,xelatex,lualatex')"
    },
    {
      "path": "scripts/check-cloud-compile-worker.mjs",
      "line": 21,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (health?.status !== 'ok' || health?.service !== 'texise-latex-compile-service') throw new Error('Cloud Compile health identity mismatch.');"
    },
    {
      "path": "scripts/check-cloud-compile-worker.mjs",
      "line": 61,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "TeXise Cloud Compile ${engine} certification."
    },
    {
      "path": "scripts/check-cloud-compile-worker.mjs",
      "line": 146,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Cloud Compile production worker certified: engines=${allowedEngines.join(',')}; multi-file=PASS; SyncTeX=PASS; TeXLiveFull=${allowedEngines.includes('pdflatex') ? 'PASS' : 'SKIP'}; Biber=${allowedEngines.includes('pdflatex') ? 'PASS' : 'SKIP'}; unsupported-engine=PASS.`);"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const host = process.argv[3] || 'www.texise.com';"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "// check as root with /etc/texise/texise.env exported into this process, so it"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 64,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "provider.awareness.setLocalStateField('texiseSession', {"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 113,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "state?.texiseSession?.protocolVersion === 7 &&"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 114,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "state?.texiseSession?.reviewSchemaVersion === 1 &&"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 115,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "state?.texiseSession?.capabilities?.includes('shared-review-v1') &&"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 116,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "state?.texiseSession?.role === 'host' &&"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 117,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "state?.texiseSession?.roomId === 'health-room' &&"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 118,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "state?.texiseSession?.hostSessionId === hostSessionId"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 252,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "for (const char of 'TeXise') a.text().insert(a.text().length, char);"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 253,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "await waitFor(() => b.text().toString() === 'TeXise', 'incremental A→B document convergence');"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 255,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "await waitFor(() => a.text().toString() === 'TeXise collaboration', 'incremental B→A document convergence');"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 264,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "await waitFor(() => c.text().toString() === 'TeXise collaboration', 'late-join state-vector convergence');"
    },
    {
      "path": "scripts/check-collaboration-live.mjs",
      "line": 270,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Collaboration live relay health check passed: real y-websocket providers, ready-host verification, bidirectional incremental updates, awareness, late-join convergence, and transient full-project binary payload relay.');"
    },
    {
      "path": "scripts/check-collaboration-signaling.mjs",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const host = process.argv[3] || 'app.texise.com';"
    },
    {
      "path": "scripts/check-collaboration-signaling.mjs",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Collaboration signaling WebSocket health timed out.');"
    },
    {
      "path": "scripts/check-collaboration-signaling.mjs",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Collaboration signaling WebSocket health check passed.');"
    },
    {
      "path": "scripts/check-collaboration-signaling.mjs",
      "line": 33,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error(`[TeXise] Collaboration signaling WebSocket health failed: ${error.message}`);"
    },
    {
      "path": "scripts/check-console-gateway.mjs",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const base = String(process.env.TEXISE_CONSOLE_GATEWAY_URL || 'http://127.0.0.1:8787').replace(/\\/$/u, '');"
    },
    {
      "path": "scripts/check-console-gateway.mjs",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const secret = String(process.env.TEXISE_CONSOLE_GATEWAY_SECRET || '');"
    },
    {
      "path": "scripts/check-console-gateway.mjs",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const expectedImage = String(process.env.TEXISE_CONSOLE_IMAGE || 'texlive/texlive-console:pro');"
    },
    {
      "path": "scripts/check-console-gateway.mjs",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (!secret) throw new Error('TEXISE_CONSOLE_GATEWAY_SECRET is required for certification.');"
    },
    {
      "path": "scripts/check-console-gateway.mjs",
      "line": 11,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const consoleGatewayPackage = path.join(sourceRoot, 'texise-services/console-gateway/package.json');"
    },
    {
      "path": "scripts/check-console-gateway.mjs",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const source = Buffer.from('TeXise terminal upload certification\\n');"
    },
    {
      "path": "scripts/check-console-gateway.mjs",
      "line": 31,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const ws = new WebSocket(`${wsBase}${session.wsPath}?cols=120&rows=34`, ['texise-console', `texise-auth.${session.token}`]);"
    },
    {
      "path": "scripts/check-console-gateway.mjs",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const successMarker = '__TEXISE_CONSOLE_CERT_OK__';"
    },
    {
      "path": "scripts/check-console-gateway.mjs",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"printf '%s%s\\\\n' '__TEXISE_CONSOLE_CERT_' 'OK__'\","
    },
    {
      "path": "scripts/check-staged-trusted-runtime.mjs",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const expectedRoot = path.resolve(process.env.TEXISE_TEMPLATE_ROOT || '');"
    },
    {
      "path": "scripts/check-staged-trusted-runtime.mjs",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const expectedPublicCopy = path.resolve(process.env.TEXISE_TEMPLATE_PUBLIC_COPY || '');"
    },
    {
      "path": "scripts/check-staged-trusted-runtime.mjs",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (!process.env.TEXISE_TEMPLATE_ROOT || !process.env.TEXISE_TEMPLATE_PUBLIC_COPY) {"
    },
    {
      "path": "scripts/check-staged-trusted-runtime.mjs",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "throw new Error('TEXISE_TEMPLATE_ROOT and TEXISE_TEMPLATE_PUBLIC_COPY are required for staged runtime verification.');"
    },
    {
      "path": "scripts/check-staged-trusted-runtime.mjs",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "process.stdout.write('[TeXise] Staged trusted runtime module graph and template paths verified; comparison data verified.\\n');"
    },
    {
      "path": "scripts/compare-audit.mjs",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const staleDays = Number.parseInt(process.env.TEXISE_COMPARE_STALE_DAYS || '120', 10);"
    },
    {
      "path": "scripts/dev-ports.js",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env: 'TEXISE_DEV_PORT',"
    },
    {
      "path": "scripts/dev-ports.js",
      "line": 17,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env: 'TEXISE_PREVIEW_PORT',"
    },
    {
      "path": "scripts/dev-ports.js",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env: 'TEXISE_STORYBOOK_PORT',"
    },
    {
      "path": "scripts/dev-ports.js",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env: 'TEXISE_E2E_PORT',"
    },
    {
      "path": "scripts/dev-ports.js",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env: 'TEXISE_E2E_CT_PORT',"
    },
    {
      "path": "scripts/dev-ports.js",
      "line": 70,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (process.env.TEXISE_PORT_SEED) {"
    },
    {
      "path": "scripts/dev-ports.js",
      "line": 71,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return process.env.TEXISE_PORT_SEED;"
    },
    {
      "path": "scripts/dev-ports.js",
      "line": 118,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_PORT_SEED=my-worktree node scripts/dev-ports.js --json"
    },
    {
      "path": "scripts/dev-ports.js",
      "line": 189,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`export TEXISE_PORT_SEED=${shellQuote(result.seed)}`,"
    },
    {
      "path": "scripts/dev-ports.js",
      "line": 190,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`export TEXISE_PORT_SLOT=${result.slot}`,"
    },
    {
      "path": "scripts/dev-ports.spec.js",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "vi.stubEnv('TEXISE_DEV_PORT', '5555');"
    },
    {
      "path": "scripts/dev-ports.spec.js",
      "line": 36,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "vi.stubEnv('TEXISE_E2E_CT_PORT', '3555');"
    },
    {
      "path": "scripts/dev-ports.spec.js",
      "line": 46,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "vi.stubEnv('TEXISE_DEV_PORT', '2999');"
    },
    {
      "path": "scripts/dev-ports.spec.js",
      "line": 49,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`TEXISE_DEV_PORT must be an integer port from ${MIN_DEV_PORT}`,"
    },
    {
      "path": "scripts/dev-ports.spec.js",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"export TEXISE_PORT_SEED='branch '\\\\'' one'\","
    },
    {
      "path": "scripts/dev-ports.spec.js",
      "line": 60,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`export TEXISE_DEV_PORT=${result.ports.dev}`,"
    },
    {
      "path": "scripts/dev-ports.spec.js",
      "line": 63,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`export TEXISE_E2E_CT_PORT=${result.ports['e2e-ct']}`,"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const profile = (process.env.TEXISE_COMPILER_PROFILE || 'full').trim().toLowerCase();"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const version = process.env.TEXISE_BUSY_COMPILER_VERSION || '1.4.0';"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const moduleUrl = process.env.TEXISE_BUSY_COMPILER_MODULE_URL;"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const assetUrl = process.env.TEXISE_BUSY_COMPILER_ASSET_URL;"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "process.env.TEXISE_BUSY_COMPILER_DIR ||"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const configuredCache = process.env.TEXISE_BUSY_COMPILER_CACHE_DIR?.trim();"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 46,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const BUSYTEX_MANIFEST_FILE = '.texise-busytex-manifest.json';"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 69,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`TEXISE_BUSY_COMPILER_VERSION=${version} is not a supported numeric texlyre-busytex version. Full-profile npm provisioning requires 1.4.0 or newer.`,"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 74,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`texlyre-busytex@${version} predates the Biber runtime required by TeXise full compiler mode. Set TEXISE_BUSY_COMPILER_VERSION=1.4.0 (or newer) before provisioning.`,"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 122,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`[TeXise] Applying BusyTeX ${version} legacy no-Biber ABI compatibility shim in place; reusing the installed WASM/data payload.`,"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 133,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "// but TeXise must not overwrite their JavaScript with the 1.4.0 build."
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 141,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "`[TeXise] Pinning BusyTeX ${version} runtime JavaScript ABI ${BUSYTEX_RUNTIME_ABI}`,"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 145,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const staging = `${destination}.texise-next-${process.pid}`;"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 228,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "`[TeXise] BusyTeX hardlink cache restore unavailable; falling back to a file copy. ${error.message}`,"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 246,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "`[TeXise] Repairing cached BusyTeX ${version} JavaScript ABI from the pinned v1.4 build; the large WASM/data payload will be reused.`,"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 254,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "`[TeXise] Ignoring stale BusyTeX cache ${cache}: runtime ABI is not ${BUSYTEX_RUNTIME_ABI}`,"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 260,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Restoring BusyTeX ${version} from persistent cache ${cache}`);"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 286,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Cached BusyTeX ${version} (${BUSYTEX_RUNTIME_ABI}) at ${cache}`);"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 314,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Fetching configured BusyTeX browser runtime ${version}`);"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 334,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Provisioning texlyre-busytex@${version} for full browser compiler profile`);"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 366,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Compiler profile pdflatex selected; using SwiftLaTeX fallback only.');"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 370,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "throw new Error(`Unknown TEXISE_COMPILER_PROFILE=${profile}; expected full or pdflatex`);"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 376,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "`[TeXise] Repairing existing BusyTeX ${version} JavaScript ABI from the pinned v1.4 build; reusing the installed WASM/data payload.`,"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 385,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Full BusyTeX compiler assets already present (${BUSYTEX_RUNTIME_ABI}).`);"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 391,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Full BusyTeX compiler assets restored without downloading the 524 MB runtime.');"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 395,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const temporary = await mkdtemp(join(tmpdir(), 'texise-busytex-'));"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 401,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'Set both TEXISE_BUSY_COMPILER_MODULE_URL and TEXISE_BUSY_COMPILER_ASSET_URL, or leave both empty to use the pinned texlyre-busytex package.',"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 408,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "// pipeline signature beside the 1.4 JavaScript API. TeXise can safely"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 427,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "`BusyTeX ${version} provisioning completed without the complete TeXise full-profile runtime asset set.${detail}`,"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 432,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Full browser compiler assets installed at ${target}`);"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 441,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "`[TeXise] BusyTeX assets unavailable; SwiftLaTeX fallback will remain active. ${error.message}`,"
    },
    {
      "path": "scripts/fetch-busytex-assets.mjs",
      "line": 446,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error(`[TeXise error] ${error.stack || error.message}`);"
    },
    {
      "path": "scripts/generate-compiler-status.mjs",
      "line": 74,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const compilerProfile = (process.env.TEXISE_COMPILER_PROFILE || 'full').trim().toLowerCase();"
    },
    {
      "path": "scripts/generate-compiler-status.mjs",
      "line": 110,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const busytexManifest = await readJson(path.join(busytexRoot, '.texise-busytex-manifest.json'), {});"
    },
    {
      "path": "scripts/generate-compiler-status.mjs",
      "line": 130,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_TEXLIVE_REMOTE_URL',"
    },
    {
      "path": "scripts/generate-compiler-status.mjs",
      "line": 135,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_TEXLIVE_STATIC_MIRROR_URL',"
    },
    {
      "path": "scripts/generate-compiler-status.mjs",
      "line": 139,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_TEXLIVE_LSR_URL',"
    },
    {
      "path": "scripts/generate-compiler-status.mjs",
      "line": 143,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_BUSY_TEXLIVE_ENDPOINT',"
    },
    {
      "path": "scripts/generate-compiler-status.mjs",
      "line": 209,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": ": process.env.TEXISE_BUSY_COMPILER_VERSION || '1.4.0',"
    },
    {
      "path": "scripts/generate-lucide-category-assets.mjs",
      "line": 13,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const outputRoot = path.join(root, 'packages/tooling/browser-entry/public/texise-icons');"
    },
    {
      "path": "scripts/generate-lucide-category-assets.mjs",
      "line": 70,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "await writeFile(spritePath, `<svg xmlns=\"http://www.w3.org/2000/svg\"><title>TeXise Lucide category icon sprite</title>${symbols.join('')}</svg>\\n`, 'utf8');"
    },
    {
      "path": "scripts/generate-template-manifest.mjs",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "process.stdout.write(`[TeXise] Indexed ${manifest.templates.length} published templates (${manifest.contentHash.slice(0, 12)}).\\n`);"
    },
    {
      "path": "scripts/generate-template-manifest.mjs",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error(`[TeXise] ${error instanceof Error ? error.message : String(error)}`);"
    },
    {
      "path": "scripts/generate-template-manifest.node.test.mjs",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const root = await mkdtemp(path.join(os.tmpdir(), 'texise-templates-'));"
    },
    {
      "path": "scripts/generate-template-manifest.node.test.mjs",
      "line": 26,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(JSON.stringify(manifest), /\\/texise-templates\\/(?:free|pro)\\//u);"
    },
    {
      "path": "scripts/generate-template-manifest.node.test.mjs",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const publicCopy = await mkdtemp(path.join(os.tmpdir(), 'texise-template-public-'));"
    },
    {
      "path": "scripts/hotfix10-admin-template-management-regression.test.mjs",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'Select all visible templates', 'Created', 'Updated', 'texise-admin-sort-button',"
    },
    {
      "path": "scripts/hotfix10-admin-template-management-regression.test.mjs",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "for (const token of ['export async function deleteTemplates', \"mkdtemp(path.join(root, '.texise-delete-'))\", 'await runTemplateAssetsSync(root, publicCopy)', 'await rename(item.backup, item.directory)']) assert.ok(library.includes(token), `missing transactional deletion contract: ${token}`);"
    },
    {
      "path": "scripts/hotfix10-admin-template-management-regression.test.mjs",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "\"const DEFAULT_TEMPLATE_THUMBNAIL_URL = '/texise-template-default-thumbnail.webp'\","
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 27,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visual = await read('packages/js-lib/latex-visual/src/native-texise-editor.ts');"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 79,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 81,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(browser.includes('/texise-icons/lucide-category-icons.json'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 82,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(browser.includes('/texise-icons/lucide-category-icons.svg'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 85,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(renderer.includes('/texise-icons/lucide/'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 89,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(deploy.includes('texise-icons/lucide-category-icons.svg'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 90,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(deploy.includes(\"texise_frontend_request '/texise-icons/lucide-category-icons.svg'\"));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 95,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts'),"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 106,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(css.includes('.texise-visual-text-environment-body'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 107,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(css.includes('.texise-visual-raw-inline'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 114,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts'),"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 130,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(native.includes('texise-visual-figure-preview-grid'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 139,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(css.includes('.texise-visual-figure-preview-grid'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 146,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts'),"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 153,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(native.includes(\"'texise-visual-protected-clickable'\"));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 166,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(css.includes('.texise-visual-protected-clickable:hover'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 167,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(css.includes('.texise-visual-raw-inline:focus-visible'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 190,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts'),"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 217,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(app.includes('className=\"texise-template-card texise-template-card-clickable\"'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 218,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(app.includes('return <div\\n    className=\"texise-template-card texise-template-card-clickable\"'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 232,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(css.includes('.texise-template-featured-grid { grid-template-columns: repeat(4,minmax(0,1fr)); align-items: start;'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 233,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(css.includes('.texise-template-card { overflow: hidden; min-width: 0; align-self: start; height: fit-content; }'));"
    },
    {
      "path": "scripts/hotfix10-complex-latex-editor-regression.test.mjs",
      "line": 234,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(css.includes('.texise-template-results .texise-template-grid { grid-template-columns: repeat(3,minmax(0,1fr)); align-items: start; }'));"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const apache = await read('deploy/apache/texise.com-https.conf');"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(apache.includes('RewriteRule ^/?latex-templates/?$ https://www.texise.com/templates [R=301,L,NE]'));"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(apache.includes('RewriteRule ^/?latex-templates/([A-Za-z0-9-]+)/?$ https://www.texise.com/templates/$1 [R=301,L,NE]'));"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(apache.includes('<LocationMatch \"^/texise-templates/(free|pro)/\">'));"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(apache.includes('<LocationMatch \"^/texise-templates/(?:institutions|redirects)\\\\.json$\">'));"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(apache, /texise-templates\\/\\(free\\|pro\\)[\\s\\S]*Require all denied/u);"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(generator, /return `\\/texise-templates\\/\\$\\{tier\\}/u);"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const manifest = await read('texise-templates/templates.json');"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 23,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(manifest, /\\/texise-templates\\/(?:free|pro)\\//u);"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 46,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(manifestCore, /TEXISE_TEMPLATE_ROOT/u);"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(manifestCore, /TEXISE_TEMPLATE_PUBLIC_COPY/u);"
    },
    {
      "path": "scripts/hotfix10-platform-regression.test.mjs",
      "line": 70,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(marketing, /TeXise vs Overleaf/u);"
    },
    {
      "path": "scripts/hotfix10-template-category-pdfjs-regression.test.mjs",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const registry = JSON.parse(await read('texise-templates/categories.json'));"
    },
    {
      "path": "scripts/hotfix10-template-category-pdfjs-regression.test.mjs",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "for (const entry of await fs.readdir(`texise-templates/${tier}`, { withFileTypes: true })) {"
    },
    {
      "path": "scripts/hotfix10-template-category-pdfjs-regression.test.mjs",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const metadata = JSON.parse(await read(`texise-templates/${tier}/${entry.name}/template.json`));"
    },
    {
      "path": "scripts/hotfix10-template-category-pdfjs-regression.test.mjs",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(browser.includes(\"/texise-icons/lucide-category-icons.json\") && browser.includes(\"/texise-icons/lucide-category-icons.svg\"), 'Admin icon browser must use build-generated static Lucide catalog/sprite assets');"
    },
    {
      "path": "scripts/hotfix10-template-category-pdfjs-regression.test.mjs",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(icon.includes('/texise-icons/lucide/'), 'public category icons must use lightweight static SVG assets');"
    },
    {
      "path": "scripts/hotfix10-template-category-pdfjs-regression.test.mjs",
      "line": 60,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(css.includes('.texise-category-icon-grid') && css.includes('.texise-category-icon-tile[data-selected=true]'));"
    },
    {
      "path": "scripts/hotfix10-template-category-pdfjs-regression.test.mjs",
      "line": 78,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(seo.includes(\"readFileImpl(join(config.webRoot, 'texise-templates', 'categories.json')\"));"
    },
    {
      "path": "scripts/hotfix10-template-category-pdfjs-regression.test.mjs",
      "line": 129,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(viewer, /className=\"texise-template-pdfjs-toolbar\" role=\"toolbar\" aria-label=\"PDF preview controls\"/u, 'PDF controls must use a toolbar role for their accessible label');"
    },
    {
      "path": "scripts/hotfix10-template-category-pdfjs-regression.test.mjs",
      "line": 138,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const [manifest, apache, deploy] = await Promise.all([read('server/template-manifest.mjs'), read('deploy/apache/texise.com-https.conf'), read('scripts/lib/texise-deploy.sh')]);"
    },
    {
      "path": "scripts/hotfix10-template-category-pdfjs-regression.test.mjs",
      "line": 142,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(apache.includes('<Location \"/texise-templates/categories.json\">') && apache.includes('no-cache, no-store, must-revalidate'));"
    },
    {
      "path": "scripts/hotfix10-template-category-pdfjs-regression.test.mjs",
      "line": 143,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(deploy.includes('texise-templates/categories.json') && deploy.includes(\"texise_frontend_request '/texise-templates/categories.json'\"));"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 63,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const preflightRoot = path.join(parent, `.texise-template-preflight-${nonce}`);"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 88,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const incoming = path.join(tierRoot, `.texise-import-${item.slug}-${nonce}`);"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 89,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const backup = path.join(tierRoot, `.texise-backup-${item.slug}-${nonce}`);"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 111,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "log(`[TeXise] Installed ${item.tier}/${item.slug}${item.hadExisting ? ' (updated)' : ''}.`);"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 132,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "log(`[TeXise] Cleared staged upload ${item.tier}/${item.slug}.`);"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 146,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "log(`[TeXise] Template staging root: ${resolvedStaging}`);"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 147,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "log(`[TeXise] Free staged templates: ${counts.free}`);"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 148,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "log(`[TeXise] Pro staged templates: ${counts.pro}`);"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 151,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "log('[TeXise] No staged templates found; continuing normal installation.');"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 156,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "log(`[TeXise] Validating ${staged.length} staged template${staged.length === 1 ? '' : 's'} against the canonical catalog...`);"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 165,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "log(`[TeXise] Staged template import complete: ${staged.length} installed/updated and staging cleared.`);"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 183,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const targetRoot = path.resolve(option('target') || path.join(sourceRoot, 'texise-templates'));"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 185,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const sourceMirrorRoot = path.resolve(sourceRoot, 'texise-templates');"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 187,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "// BF50.9 compatibility guard: /var/www/texise.com/templates stopped being a"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 195,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Legacy staging command detected for authoritative template library ${stagingRoot}.`);"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 196,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Skipping destructive staging import; persistent templates will not be cleared.');"
    },
    {
      "path": "scripts/import-staged-templates.mjs",
      "line": 205,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error(`[TeXise] ${error instanceof Error ? error.message : String(error)}`);"
    },
    {
      "path": "scripts/install.sh",
      "line": 5,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "# shellcheck source=lib/texise-deploy.sh"
    },
    {
      "path": "scripts/install.sh",
      "line": 6,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "source \"${SCRIPT_DIR}/lib/texise-deploy.sh\""
    },
    {
      "path": "scripts/install.sh",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_root"
    },
    {
      "path": "scripts/install.sh",
      "line": 10,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_command \"${command_name}\""
    },
    {
      "path": "scripts/install.sh",
      "line": 12,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_node_version"
    },
    {
      "path": "scripts/install.sh",
      "line": 13,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_package_manager"
    },
    {
      "path": "scripts/install.sh",
      "line": 14,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_source_location"
    },
    {
      "path": "scripts/install.sh",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Installing TeXise R14.28.20 Build Fix 51.4 from ${TEXISE_SOURCE_ROOT}\""
    },
    {
      "path": "scripts/install.sh",
      "line": 17,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/repair-buildfix50-source.mjs\" \"${TEXISE_SOURCE_ROOT}\""
    },
    {
      "path": "scripts/install.sh",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/repair-buildfix51-source.mjs\" \"${TEXISE_SOURCE_ROOT}\""
    },
    {
      "path": "scripts/install.sh",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/repair-buildfix51-1-source.mjs\" \"${TEXISE_SOURCE_ROOT}\""
    },
    {
      "path": "scripts/install.sh",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/repair-buildfix51-2-source.mjs\" \"${TEXISE_SOURCE_ROOT}\""
    },
    {
      "path": "scripts/install.sh",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/repair-buildfix51-3-source.mjs\" \"${TEXISE_SOURCE_ROOT}\""
    },
    {
      "path": "scripts/install.sh",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/repair-buildfix51-4-source.mjs\" \"${TEXISE_SOURCE_ROOT}\""
    },
    {
      "path": "scripts/install.sh",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_create_service_user"
    },
    {
      "path": "scripts/install.sh",
      "line": 24,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_create_directories"
    },
    {
      "path": "scripts/install.sh",
      "line": 25,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_prepare_source_permissions"
    },
    {
      "path": "scripts/install.sh",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_config"
    },
    {
      "path": "scripts/install.sh",
      "line": 27,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_signing_keys"
    },
    {
      "path": "scripts/install.sh",
      "line": 28,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_normalize_config_permissions"
    },
    {
      "path": "scripts/install.sh",
      "line": 29,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_dependencies"
    },
    {
      "path": "scripts/install.sh",
      "line": 30,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_build_frontend"
    },
    {
      "path": "scripts/install.sh",
      "line": 31,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_prepare_template_runtime_permissions"
    },
    {
      "path": "scripts/install.sh",
      "line": 32,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_activate_runtime_server"
    },
    {
      "path": "scripts/install.sh",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_admin_cli"
    },
    {
      "path": "scripts/install.sh",
      "line": 34,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_systemd"
    },
    {
      "path": "scripts/install.sh",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_apache"
    },
    {
      "path": "scripts/install.sh",
      "line": 36,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_restart_services"
    },
    {
      "path": "scripts/install.sh",
      "line": 37,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_health_check"
    },
    {
      "path": "scripts/install.sh",
      "line": 39,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Installation complete.'"
    },
    {
      "path": "scripts/install.sh",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Source tree: ${TEXISE_INSTALL_ROOT}\""
    },
    {
      "path": "scripts/install.sh",
      "line": 41,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Apache document root: ${TEXISE_DIST_DIR}\""
    },
    {
      "path": "scripts/install.sh",
      "line": 42,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Trusted configuration: ${TEXISE_CONFIG_DIR}/\""
    },
    {
      "path": "scripts/install.sh",
      "line": 43,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log 'Web application: https://www.texise.com'"
    },
    {
      "path": "scripts/learnitive-abuse-controls.node.test.mjs",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const compile = await read('texise-services/cloud-compile/server.js');"
    },
    {
      "path": "scripts/learnitive-abuse-controls.node.test.mjs",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const gateway = await read('texise-services/console-gateway/server.js');"
    },
    {
      "path": "scripts/learnitive-abuse-controls.node.test.mjs",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/config/texise.env.example'),"
    },
    {
      "path": "scripts/learnitive-brand-assets.node.test.mjs",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /texise-brand-name\">Learnitive</u);"
    },
    {
      "path": "scripts/learnitive-brand-assets.node.test.mjs",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(app, /\\/texise-logo(?:-mobile)?\\.png/u);"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const needle = /TeXise|texise|TEXISE|TeXiser|texise\\.com/gu;"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return path.startsWith('packages/core/app/src/') || path.startsWith('packages/tooling/browser-entry/') || path.startsWith('packages/core/service-core/src/') || path.startsWith('server/') || path.startsWith('texise-services/');"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (/TeXise/u.test(line) && !/\\bTeXise\\b/u.test(line) && !/texise\\.com/iu.test(line)) return ['legacy-identifier', 'internal identifier containing the legacy product token'];"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (/\\/var\\/www\\/texise\\.com|\\/etc\\/texise|admin@texise\\.com/iu.test(line)) return ['compatibility-migration', 'legacy deployment path or administrator identity retained for migration'];"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (/\\bTeXise[A-Z][A-Za-z0-9_]*\\b/u.test(line) && !/[\"'`]TeXise\\b/u.test(line)) return ['legacy-identifier', 'internal PascalCase symbol retained for compatibility'];"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 23,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "if (legalFiles.has(path) || /copyright|agpl|license|attribution|provenance/iu.test(line) && /TeXise/iu.test(line)) return ['legal-attribution', 'legal/provenance text'];"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (isMigration(path) || /LEGACY_|legacy|backward.compat|fallback.*TEXISE|TEXISE_[A-Z0-9_]+/u.test(line)) return ['compatibility-migration', 'legacy state/configuration compatibility'];"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (/@texise\\//u.test(line) || /(?:^|[\\s'\"`/_.-])texise(?:[-_:/.]|$)/u.test(line) || /data-texise|className=.*texise|texise-fonts|texise-icons|texise-services|texise-templates|\\/var\\/www\\/texise|\\/etc\\/texise/iu.test(line)) {"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (!/TeXise|TeXiser|texise\\.com/u.test(line)) return ['legacy-identifier', 'internal package/CSS/path/storage identifier'];"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (/separate TeXise product|legacy TeXise product/iu.test(line)) return ['separate-product-reference', 'explicit separate-product reference'];"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 33,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (/@texise\\//u.test(line)) return ['legacy-identifier', 'internal package namespace'];"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 34,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (!/TeXise|TeXiser|texise\\.com/u.test(line)) return ['legacy-identifier', 'lower-case internal package/CSS/storage/protocol identifier'];"
    },
    {
      "path": "scripts/learnitive-brand-audit.mjs",
      "line": 37,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (/package\\.json$/u.test(path) && /\"name\"\\s*:\\s*\"(?:@texise\\/|texise\")/u.test(line)) return ['legacy-identifier', 'workspace package identity retained for compatibility'];"
    },
    {
      "path": "scripts/learnitive-capability-audit.mjs",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "// It must not require retired TeXise service paths, anonymous collaboration, or"
    },
    {
      "path": "scripts/learnitive-capability-audit.mjs",
      "line": 54,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['templates.catalog', true, () => exists('packages/tooling/browser-entry/public/texise-templates')],"
    },
    {
      "path": "scripts/learnitive-hotfix34-template-brand-regression.node.test.mjs",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /src=\"\\/learnitive-logo-mobile\\.png\"[\\s\\S]*?texise-brand-name\">Learnitive</u);"
    },
    {
      "path": "scripts/learnitive-hotfix34-template-brand-regression.node.test.mjs",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(header, /texise-ws-brand[\\s\\S]*?src=\"\\/learnitive-logo-mobile\\.png\"[\\s\\S]*?<strong>Learnitive<\\/strong>/u);"
    },
    {
      "path": "scripts/learnitive-hotfix34-template-brand-regression.node.test.mjs",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(saasCss, /@media \\(max-width: 48rem\\)[\\s\\S]*?\\.texise-brand-name \\{ display: none; \\}/u);"
    },
    {
      "path": "scripts/learnitive-hotfix34-template-brand-regression.node.test.mjs",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(editorCss, /\\.texise-ws-brand > img/u);"
    },
    {
      "path": "scripts/learnitive-learn-media.node.test.mjs",
      "line": 134,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(unit,/ReadWritePaths=.*-\\/var\\/www\\/os\\.learnitive\\.com\\/public_html\\/dist\\/texise-templates/u);"
    },
    {
      "path": "scripts/learnitive-r11-invariants.node.test.mjs",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const constants = source.indexOf('const TEXISE_REQUIRED_FONT_FACES');"
    },
    {
      "path": "scripts/learnitive-r11-invariants.node.test.mjs",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/src/texise-design.css'),"
    },
    {
      "path": "scripts/learnitive-r11-invariants.node.test.mjs",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(css, /\\/texise-fonts\\//u);"
    },
    {
      "path": "scripts/learnitive-r12-release-audit.mjs",
      "line": 31,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(dependency, /^@texise\\//u, `${packageFile} still depends on legacy ${dependency}`);"
    },
    {
      "path": "scripts/learnitive-r12-release-audit.mjs",
      "line": 37,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(lockfile, /@texise\\//u, 'pnpm-lock.yaml must not contain the legacy @texise workspace scope');"
    },
    {
      "path": "scripts/learnitive-r12-release-audit.mjs",
      "line": 48,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(source, /@texise\\//u, `${child} still imports the legacy @texise workspace scope`);"
    },
    {
      "path": "scripts/learnitive-r12-release-audit.mjs",
      "line": 89,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/texise-design.css'),"
    },
    {
      "path": "scripts/learnitive-r12-release-audit.mjs",
      "line": 168,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.doesNotMatch(installer, /texise/iu, 'top-level installer must contain zero TeXise references');"
    },
    {
      "path": "scripts/learnitive-r12-release-audit.mjs",
      "line": 171,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deployInstaller, /TEXISE_APP_ENV=staging/u, 'staging build metadata must be explicit');"
    },
    {
      "path": "scripts/learnitive-r12-release-audit.mjs",
      "line": 239,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(mainUnit, /ReadWritePaths=.*-\\/var\\/www\\/os\\.learnitive\\.com\\/public_html\\/dist\\/texise-templates/u, 'generated template projection must not make systemd namespace setup fail when a prior build is incomplete');"
    },
    {
      "path": "scripts/learnitive-r12-release-audit.mjs",
      "line": 278,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.doesNotMatch(consoleUnit, /public_html\\/texise-services\\/console-gateway/u);"
    },
    {
      "path": "scripts/learnitive-r12-release-audit.mjs",
      "line": 286,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.doesNotMatch(lucideGenerator, /\\[TeXise\\]/u);"
    },
    {
      "path": "scripts/learnitive-security-audit.node.test.mjs",
      "line": 56,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const worker = await source('texise-services/cloud-compile/server.js');"
    },
    {
      "path": "scripts/learnitive-staging-startup-hardening.node.test.mjs",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(unit, /ReadWritePaths=.*dist\\/texise-templates/u);"
    },
    {
      "path": "scripts/learnitive-template-catalog-v2.node.test.mjs",
      "line": 7,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const ROOT = new URL('../texise-templates/', import.meta.url);"
    },
    {
      "path": "scripts/learnitive-template-staging-safety.node.test.mjs",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(installer,/TEMPLATE_PUBLIC_COPY=\"\\$DIST_ROOT\\/texise-templates\"/u);"
    },
    {
      "path": "scripts/learnitive-template-staging-safety.node.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(unit,/\\/var\\/www\\/os\\.learnitive\\.com\\/public_html\\/dist\\/texise-templates/u);"
    },
    {
      "path": "scripts/learnitive-template-staging-safety.node.test.mjs",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('staging installer remains pinned away from production and TeXise roots',async()=>{"
    },
    {
      "path": "scripts/learnitive-template-staging-safety.node.test.mjs",
      "line": 30,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "for(const protectedPath of ['/var/www/texise.com','/var/www/www.texise.com','/var/www/learnitive.com','/var/www/www.learnitive.com','/etc/texise']) assert.ok(installer.includes(protectedPath),protectedPath);"
    },
    {
      "path": "scripts/learnitive-terminal-ai-polish.node.test.mjs",
      "line": 102,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(events, /texise:ai-settings-saved/u);"
    },
    {
      "path": "scripts/learnitive-terminal-ai-polish.node.test.mjs",
      "line": 140,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('texise-templates/templates.json'),"
    },
    {
      "path": "scripts/learnitive-terminal-ai-polish.node.test.mjs",
      "line": 141,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-templates/templates.json'),"
    },
    {
      "path": "scripts/lib/busytex-runtime-compat.mjs",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const BUSYTEX_RUNTIME_ABI_MARKER = 'TEXISE_BUSYTEXT_ABI_V14_BIBER_V2';"
    },
    {
      "path": "scripts/lib/busytex-runtime-compat.mjs",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const BUSYTEX_LEGACY_SHIM_MARKER = 'TEXISE_BUSYTEXT_LEGACY_NO_BIBER_SHIM_V1';"
    },
    {
      "path": "scripts/lib/busytex-runtime-compat.mjs",
      "line": 64,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "// by TeXise. The latter is forced to isolated-worker mode and bridged in"
    },
    {
      "path": "scripts/lib/busytex-runtime-compat.mjs",
      "line": 130,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const marked = `/* ${BUSYTEX_LEGACY_SHIM_MARKER}: inserted a compatibility-only biber slot so texlyre-busytex 1.4 positional calls do not shift verbose into driver. The legacy pipeline does not implement Biber; TeXise forces this runtime to isolated-worker mode and reports supportsBiber=false. */\\n${patched}`;"
    },
    {
      "path": "scripts/lib/busytex-runtime-compat.mjs",
      "line": 192,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "`BusyTeX runtime ABI mismatch at ${directory}. TeXise requires either the native ${BUSYTEX_RUNTIME_ABI} ` +"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SOURCE_ROOT=\"${TEXISE_SOURCE_ROOT:-$(cd \"$(dirname \"${BASH_SOURCE[0]}\")/../..\" && pwd)}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "TEXISE_SITE_ROOT=\"${TEXISE_SITE_ROOT:-/var/www/texise.com}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_INSTALL_ROOT=\"${TEXISE_INSTALL_ROOT:-${TEXISE_SITE_ROOT}/public_html}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DIST_DIR=\"${TEXISE_DIST_DIR:-${TEXISE_INSTALL_ROOT}/dist}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_PREVIOUS_DIST_DIR=\"${TEXISE_PREVIOUS_DIST_DIR:-${TEXISE_INSTALL_ROOT}/dist.previous}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "TEXISE_CONFIG_DIR=\"${TEXISE_CONFIG_DIR:-/etc/texise}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DATA_DIR=\"${TEXISE_DATA_DIR:-${TEXISE_INSTALL_ROOT}/texise-data}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_AUDIT_DIR=\"${TEXISE_AUDIT_DIR:-${TEXISE_DATA_DIR}/audit}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CACHE_DIR=\"${TEXISE_CACHE_DIR:-${TEXISE_DATA_DIR}/cache}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_TMP_DIR=\"${TEXISE_TMP_DIR:-${TEXISE_DATA_DIR}/tmp}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 14,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_LOG_DIR=\"${TEXISE_LOG_DIR:-${TEXISE_DATA_DIR}/log}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_COMPILER_CACHE_DIR=\"${TEXISE_COMPILER_CACHE_DIR:-${TEXISE_CACHE_DIR}/compiler}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DEPLOY_CERTIFY=\"${TEXISE_DEPLOY_CERTIFY:-0}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 17,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_APACHE_SITE=\"${TEXISE_APACHE_SITE:-/etc/apache2/sites-available/texise.com.conf}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_APP_REDIRECT_SITE=\"${TEXISE_APP_REDIRECT_SITE:-/etc/apache2/sites-available/app.texise.com-redirect.conf}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SYSTEMD_UNIT=\"${TEXISE_SYSTEMD_UNIT:-/etc/systemd/system/texise.service}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_SYSTEMD_UNIT=\"${TEXISE_CLOUD_COMPILE_SYSTEMD_UNIT:-/etc/systemd/system/texise-latex-compile.service}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_SYSTEMD_UNIT=\"${TEXISE_CONSOLE_SYSTEMD_UNIT:-/etc/systemd/system/texise-console-gateway.service}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_RUNTIME_DIR=\"${TEXISE_RUNTIME_DIR:-${TEXISE_DATA_DIR}/runtime}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_RUNTIME_CURRENT=\"${TEXISE_RUNTIME_CURRENT:-${TEXISE_RUNTIME_DIR}/current}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_RUNTIME_PREVIOUS=\"${TEXISE_RUNTIME_PREVIOUS:-${TEXISE_RUNTIME_DIR}/previous}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_RUNTIME_NEXT=\"${TEXISE_RUNTIME_NEXT:-${TEXISE_RUNTIME_DIR}/next}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_TEMPLATE_ROOT=\"${TEXISE_TEMPLATE_ROOT:-${TEXISE_SITE_ROOT}/templates}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_TEMPLATE_PUBLIC_COPY=\"${TEXISE_TEMPLATE_PUBLIC_COPY:-${TEXISE_DIST_DIR}/texise-templates}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_FONT_SOURCE_DIR=\"${TEXISE_FONT_SOURCE_DIR:-${TEXISE_SITE_ROOT}/fonts}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_MEDIA_STAGE_ROOT=\"${TEXISE_MEDIA_STAGE_ROOT:-${TEXISE_SITE_ROOT}/texise-media}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 30,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_MEDIA_PUBLISHED_ROOT=\"${TEXISE_MEDIA_PUBLISHED_ROOT:-${TEXISE_DIST_DIR}/texise-media}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "# public_html; dist/texise-media is a replaceable published projection."
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 34,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_BLOG_MEDIA_ROOT=\"${TEXISE_BLOG_MEDIA_ROOT:-${TEXISE_MEDIA_STAGE_ROOT}}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_BLOG_MEDIA_DIR=\"${TEXISE_BLOG_MEDIA_DIR:-${TEXISE_MEDIA_STAGE_ROOT}/blog}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 36,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DOCS_MEDIA_DIR=\"${TEXISE_DOCS_MEDIA_DIR:-${TEXISE_MEDIA_STAGE_ROOT}/docs}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 37,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_DIR=\"${TEXISE_CLOUD_COMPILE_DIR:-${TEXISE_INSTALL_ROOT}/texise-services/cloud-compile}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 38,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_TMP=\"${TEXISE_CLOUD_COMPILE_TMP:-${TEXISE_TMP_DIR}/cloud-compile}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 39,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_ENV=\"${TEXISE_CLOUD_COMPILE_ENV:-${TEXISE_CONFIG_DIR}/cloud-compile.env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_DIR=\"${TEXISE_CONSOLE_DIR:-${TEXISE_INSTALL_ROOT}/texise-services/console-gateway}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 41,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_TMP=\"${TEXISE_CONSOLE_TMP:-${TEXISE_TMP_DIR}/console}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 42,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_ENV=\"${TEXISE_CONSOLE_ENV:-${TEXISE_CONFIG_DIR}/console-gateway.env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 43,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_IMAGE_CONTEXT=\"${TEXISE_CONSOLE_IMAGE_CONTEXT:-${TEXISE_SOURCE_ROOT}/deploy/docker/console}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 44,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_IMAGE_SCHEMA=\"${TEXISE_CONSOLE_IMAGE_SCHEMA:-r14.28.14-bf12}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 45,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# Historical TeXise-owned locations are read only during verified upgrade migration."
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 46,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_LEGACY_DATA_DIR=\"${TEXISE_LEGACY_DATA_DIR:-/var/lib/texise}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_LEGACY_BLOG_MEDIA_ROOT=\"${TEXISE_LEGACY_BLOG_MEDIA_ROOT:-/var/lib/texise-media}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 49,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 50,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "printf '[TeXise] %s\\n' \"$*\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 53,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_die() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 54,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "printf '[TeXise error] %s\\n' \"$*\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 58,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_root() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 59,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ \"${EUID}\" -eq 0 ]] || texise_die 'Run this command as root or with sudo.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 62,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_command() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 63,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "command -v \"$1\" >/dev/null 2>&1 || texise_die \"Required command not found: $1\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 66,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_node_version() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 69,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "[[ \"${major}\" -ge 22 ]] || texise_die \"TeXise requires Node.js 22 or newer; found $(node --version).\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 72,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_pnpm() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 83,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_die 'PNPM is required. Install pnpm or provide Corepack with the pinned pnpm version.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 86,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_package_manager() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 91,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Enabling the Corepack pnpm shim required by nested workspace scripts.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 93,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "command -v pnpm >/dev/null 2>&1 || texise_die 'Corepack could not enable the pnpm shim.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 96,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_die 'PNPM is required. Install pnpm or Corepack before installing TeXise.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 99,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_source_location() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 101,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ ! -L \"${TEXISE_INSTALL_ROOT}\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 102,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_INSTALL_ROOT} must be a real source directory, not an R12 release symlink.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 103,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "source_real=\"$(readlink -f \"${TEXISE_SOURCE_ROOT}\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 104,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install_real=\"$(readlink -m \"${TEXISE_INSTALL_ROOT}\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 106,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ \"${source_real}\" == \"${install_real}\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 107,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"TeXise source must be located at ${TEXISE_INSTALL_ROOT}. Current source: ${source_real}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 108,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_SOURCE_ROOT}/package.json\" ]] || texise_die 'TeXise package.json is missing from the source root.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 109,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_SOURCE_ROOT}/server/index.mjs\" ]] || texise_die 'TeXise trusted API source is missing from server/index.mjs.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 112,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_create_service_user() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 113,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if ! getent group texise >/dev/null 2>&1; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 114,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "groupadd --system texise"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 117,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if ! id texise >/dev/null 2>&1; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 118,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "useradd --system --gid texise --home-dir \"${TEXISE_DATA_DIR}\" --shell /usr/sbin/nologin texise"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 120,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "getent group docker >/dev/null 2>&1 || texise_die 'Docker is installed but its docker group is missing; TeXise execution services require a dedicated Docker group.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 121,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! getent group texise-compile >/dev/null 2>&1; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 122,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "groupadd --system texise-compile"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 124,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! id texise-compile >/dev/null 2>&1; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 125,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "useradd --system --gid texise-compile --home-dir \"${TEXISE_CLOUD_COMPILE_TMP}\" --shell /usr/sbin/nologin texise-compile"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 127,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "usermod -a -G docker texise-compile"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 128,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! getent group texise-console >/dev/null 2>&1; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 129,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "groupadd --system texise-console"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 131,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! id texise-console >/dev/null 2>&1; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 132,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "useradd --system --gid texise-console --home-dir \"${TEXISE_CONSOLE_TMP}\" --shell /usr/sbin/nologin texise-console"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 134,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "usermod -a -G docker texise-console"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 137,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_create_directories() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 138,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o root -g texise -m 0750 \"${TEXISE_CONFIG_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 139,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o root -g root -m 0755 \"${TEXISE_SITE_ROOT}\" \"${TEXISE_INSTALL_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 142,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "# Execution-service users need execute-only traversal through texise-data/tmp"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 145,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o root -g texise -m 0751 \"${TEXISE_DATA_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 146,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o root -g root -m 0755 \"${TEXISE_RUNTIME_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 147,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o texise -g texise -m 0750 \"${TEXISE_AUDIT_DIR}\" \"${TEXISE_CACHE_DIR}\" \"${TEXISE_LOG_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 148,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o texise -g texise -m 0711 \"${TEXISE_TMP_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 149,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o texise -g texise -m 0750 \"${TEXISE_COMPILER_CACHE_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 151,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o texise -g texise -m 0750 \"${TEXISE_TEMPLATE_ROOT}\" \"${TEXISE_TEMPLATE_ROOT}/free\" \"${TEXISE_TEMPLATE_ROOT}/pro\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 152,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o texise-compile -g texise-compile -m 0750 \"${TEXISE_CLOUD_COMPILE_TMP}\" \"${TEXISE_CLOUD_COMPILE_TMP}/jobs\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 153,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o texise-console -g texise-console -m 0750 \"${TEXISE_CONSOLE_TMP}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 157,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o root -g texise -m 0755 \"${TEXISE_MEDIA_STAGE_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 158,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o texise -g texise -m 0755 \"${TEXISE_BLOG_MEDIA_DIR}\" \"${TEXISE_DOCS_MEDIA_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 162,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ -d \"${TEXISE_INSTALL_ROOT}/texise-media/blog\" && \"${TEXISE_INSTALL_ROOT}/texise-media/blog\" != \"${TEXISE_BLOG_MEDIA_DIR}\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 163,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Migrating previous public_html Blog media into persistent staging ${TEXISE_BLOG_MEDIA_DIR}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 164,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_copy_verify_tree \"${TEXISE_INSTALL_ROOT}/texise-media/blog\" \"${TEXISE_BLOG_MEDIA_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 166,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if [[ -d /var/www/app.texise.com/public_html/texise-media/blog ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 167,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_copy_verify_tree /var/www/app.texise.com/public_html/texise-media/blog \"${TEXISE_BLOG_MEDIA_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 169,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ -d \"${TEXISE_LEGACY_BLOG_MEDIA_ROOT}/blog\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 170,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_copy_verify_tree \"${TEXISE_LEGACY_BLOG_MEDIA_ROOT}/blog\" \"${TEXISE_BLOG_MEDIA_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 172,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "# texise.service intentionally runs with UMask=0027. Historical Blog cover"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 175,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "# the supported public cover extensions; private texise-data remains denied."
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 176,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "find \"${TEXISE_BLOG_MEDIA_DIR}\" -maxdepth 1 -type f \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 179,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "find \"${TEXISE_DOCS_MEDIA_DIR}\" -maxdepth 1 -type f \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 184,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_prepare_persistent_template_library() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 185,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local packaged_root=\"${TEXISE_SOURCE_ROOT}/texise-templates\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 186,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local marker=\"${TEXISE_SITE_ROOT}/.texise-template-library-initialized\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 187,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local legacy_config_root=\"${TEXISE_SITE_ROOT}/template-config\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 189,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -d \"${packaged_root}/free\" && -d \"${packaged_root}/pro\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 191,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ ! -L \"${TEXISE_TEMPLATE_ROOT}\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 192,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Persistent template root must be a real directory: ${TEXISE_TEMPLATE_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 194,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "install -d -o texise -g texise -m 0750 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 195,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_TEMPLATE_ROOT}\" \"${TEXISE_TEMPLATE_ROOT}/free\" \"${TEXISE_TEMPLATE_ROOT}/pro\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 198,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Initialising persistent template library at ${TEXISE_TEMPLATE_ROOT} without overwriting existing files.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 199,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cp -a --no-clobber \"${packaged_root}/.\" \"${TEXISE_TEMPLATE_ROOT}/\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 208,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cp -f -- \"${legacy_file}\" \"${TEXISE_TEMPLATE_ROOT}/${file_name}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 209,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Migrated previous persistent ${file_name} into the full template library.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 215,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "# /var/www/texise.com/templates as a consumable staging inbox. If that"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 221,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "persistent_template_count=\"$(find \"${TEXISE_TEMPLATE_ROOT}/free\" \"${TEXISE_TEMPLATE_ROOT}/pro\" -mindepth 1 -maxdepth 1 -type d ! -name '.*' -print 2>/dev/null | wc -l | tr -d '[:space:]')\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 225,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Persistent template library is empty; recovering ${packaged_template_count} packaged templates without overwriting surviving Admin data.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 226,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cp -a --no-clobber \"${packaged_root}/.\" \"${TEXISE_TEMPLATE_ROOT}/\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 232,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_TEMPLATE_ROOT}/${file_name}\" && ! -L \"${TEXISE_TEMPLATE_ROOT}/${file_name}\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 233,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Persistent template registry is missing or unsafe: ${TEXISE_TEMPLATE_ROOT}/${file_name}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 237,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_sync_persistent_template_source_mirror() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 238,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local mirror=\"${TEXISE_SOURCE_ROOT}/texise-templates\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 240,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "persistent_real=\"$(readlink -m \"${TEXISE_TEMPLATE_ROOT}\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 243,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ ! -L \"${mirror}\" ]] || texise_die \"Refusing symlinked source template mirror: ${mirror}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 247,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cp -a \"${TEXISE_TEMPLATE_ROOT}/.\" \"${mirror}/\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 250,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Synchronized persistent template library into replaceable source mirror ${mirror}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 253,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_prepare_source_permissions() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 254,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "chmod 0755 \"${TEXISE_INSTALL_ROOT}\" \"${TEXISE_INSTALL_ROOT}/server\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 255,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "chmod 0644 \"${TEXISE_INSTALL_ROOT}\"/server/*.mjs"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 258,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_prepare_template_runtime_permissions() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 259,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -d \"${TEXISE_TEMPLATE_ROOT}\" ]] || texise_die \"Canonical template source is missing: ${TEXISE_TEMPLATE_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 260,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -d \"${TEXISE_TEMPLATE_PUBLIC_COPY}\" ]] || texise_die \"Built template catalog is missing: ${TEXISE_TEMPLATE_PUBLIC_COPY}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 262,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# Admin template operations run as the unprivileged texise service account."
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 265,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "chown -R texise:texise \"${TEXISE_TEMPLATE_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 266,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "find \"${TEXISE_TEMPLATE_ROOT}\" -type d -exec chmod 0750 {} +"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 267,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "find \"${TEXISE_TEMPLATE_ROOT}\" -type f -exec chmod 0640 {} +"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 270,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "chown -R texise:texise \"${TEXISE_TEMPLATE_PUBLIC_COPY}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 271,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "find \"${TEXISE_TEMPLATE_PUBLIC_COPY}\" -type d -exec chmod 0755 {} +"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 272,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "find \"${TEXISE_TEMPLATE_PUBLIC_COPY}\" -type f -exec chmod 0644 {} +"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 274,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -d \"${TEXISE_MEDIA_STAGE_ROOT}\" ]] || texise_die \"Persistent CMS media staging root is missing: ${TEXISE_MEDIA_STAGE_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 275,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -d \"${TEXISE_MEDIA_PUBLISHED_ROOT}\" ]] || texise_die \"Built CMS media projection is missing: ${TEXISE_MEDIA_PUBLISHED_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 276,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "chown -R texise:texise \"${TEXISE_MEDIA_STAGE_ROOT}\" \"${TEXISE_MEDIA_PUBLISHED_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 277,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "find \"${TEXISE_MEDIA_STAGE_ROOT}\" \"${TEXISE_MEDIA_PUBLISHED_ROOT}\" -type d -exec chmod 0755 {} +"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 278,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "find \"${TEXISE_MEDIA_STAGE_ROOT}\" \"${TEXISE_MEDIA_PUBLISHED_ROOT}\" -type f -exec chmod 0644 {} +"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 279,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Prepared writable filesystem-first template/CMS media sources and live published projections for the trusted Admin runtime.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 282,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_normalize_config_permissions() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 283,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "# /etc/texise is the root-owned, service-readable configuration trust boundary."
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 284,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# Normalize only TeXise-owned well-known files so an upgrade never changes"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 286,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o root -g texise -m 0750 \"${TEXISE_CONFIG_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 290,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise.env \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 296,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "file_path=\"${TEXISE_CONFIG_DIR}/${file_name}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 298,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "[[ ! -L \"${file_path}\" ]] || texise_die \"Refusing to normalize symlinked TeXise config file: ${file_path}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 299,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "[[ -f \"${file_path}\" ]] || texise_die \"Expected a regular TeXise config file: ${file_path}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 300,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise \"${file_path}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 304,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_verify_config_permissions"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 305,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Normalized and verified ${TEXISE_CONFIG_DIR} ownership and protected file modes\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 308,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_verify_config_permissions() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 310,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "dir_owner=\"$(stat -c '%U:%G' \"${TEXISE_CONFIG_DIR}\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 311,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "dir_mode=\"$(stat -c '%a' \"${TEXISE_CONFIG_DIR}\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 312,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ \"${dir_owner}\" == 'root:texise' ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 313,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_CONFIG_DIR} owner/group verification failed: expected root:texise, found ${dir_owner}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 314,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ \"${dir_mode}\" == '750' ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 315,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_CONFIG_DIR} mode verification failed: expected 750, found ${dir_mode}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 319,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise.env \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 325,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "file_path=\"${TEXISE_CONFIG_DIR}/${file_name}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 329,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ \"${owner}\" == 'root:texise' ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 330,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"${file_path} owner/group verification failed: expected root:texise, found ${owner}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 331,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ \"${mode}\" == '640' ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 336,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 345,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_env_value() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_env_scalar_value() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 358,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "value=\"$(texise_env_value \"${env_file}\" \"${key}\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 370,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_is_http_url() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 375,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_set_env_value() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 380,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# Environment values generated by TeXise are deliberately restricted to"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 391,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_saas_requested() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 392,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local env_file=\"${1:-${TEXISE_CONFIG_DIR}/texise.env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 393,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ \"$(texise_env_value \"${env_file}\" TEXISE_SAAS_ENABLED)\" == \"1\" ]] && return 0"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 395,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "# MYSQL_DATABASE is installed with the harmless default texise_db and must"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 398,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "value=\"$(texise_env_value \"${env_file}\" \"${key}\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 401,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ \"$(texise_env_value \"${env_file}\" TEXISE_MYSQL_CREATE_DATABASE)\" == \"1\" ]] && return 0"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 405,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_prepare_and_validate_saas_config() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 407,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_saas_requested \"${env_file}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 412,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "create_database=\"$(texise_env_value \"${env_file}\" TEXISE_MYSQL_CREATE_DATABASE)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 413,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -z \"${create_database}\" || \"${create_database}\" == \"0\" || \"${create_database}\" == \"1\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 414,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_MYSQL_CREATE_DATABASE must be 0 or 1.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 417,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "secret=\"$(texise_env_value \"${env_file}\" SESSION_SECRET)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 421,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log 'Generated a new TeXise SESSION_SECRET for the SaaS account layer.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 426,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "value=\"$(texise_env_value \"${env_file}\" \"${key}\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 430,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_die \"SaaS is enabled/configured but required MySQL values are missing: ${missing[*]}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 434,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "google_id=\"$(texise_env_value \"${env_file}\" GOOGLE_CLIENT_ID)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 435,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "google_secret=\"$(texise_env_value \"${env_file}\" GOOGLE_CLIENT_SECRET)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 437,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -n \"${google_id}\" && -n \"${google_secret}\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 440,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "smtp_host=\"$(texise_env_value \"${env_file}\" SMTP_HOST)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 441,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "smtp_port=\"$(texise_env_value \"${env_file}\" SMTP_PORT)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 442,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "smtp_from=\"$(texise_env_value \"${env_file}\" SMTP_FROM)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 444,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -n \"${smtp_host}\" && -n \"${smtp_port}\" && -n \"${smtp_from}\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 449,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_migrate_env_known_default() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 456,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log \"Migrated ${key} from retired TeXise default to ${new_value}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 460,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_config() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 461,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local env_file=\"${TEXISE_CONFIG_DIR}/texise.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 462,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local config_file=\"${TEXISE_CONFIG_DIR}/config.json\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 463,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "local license_file=\"${TEXISE_CONFIG_DIR}/license-keys\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 466,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g texise -m 0640 \"${TEXISE_SOURCE_ROOT}/deploy/config/texise.env.example\" \"${env_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 468,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise \"${env_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 470,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Preserving ${env_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 476,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_TEXLIVE_REMOTE_URL 'https://texlive2026.texlyre.org/'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 477,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_TEXLIVE_STATIC_MIRROR_URL 'https://cdn.jsdelivr.net/gh/SachaNevsky/latexdiff-texmf-dist@aca46fc00975feebf98e038976790805c3e932df'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 478,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_TEXLIVE_LSR_URL '/texlive/texlive-lsr.txt'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 479,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_COMPILER_PROFILE 'full'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 480,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_BUSY_COMPILER_VERSION '1.4.0'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 481,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_BUSY_COMPILER_MODULE_URL ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 482,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_BUSY_COMPILER_ASSET_URL ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 483,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_BUSY_TEXLIVE_ENDPOINT 'https://texlive2026.texlyre.org/'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 484,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_SIGNALING_PORT '3101'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 485,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_FONT_SOURCE_DIR '/var/www/texise.com/fonts'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 486,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_SAAS_ENABLED '0'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 487,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" MYSQL_HOST ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 488,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" MYSQL_PORT '3306'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 489,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" MYSQL_DATABASE 'texise_db'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 490,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" MYSQL_USER ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 491,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" MYSQL_PASSWORD ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 492,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_MYSQL_CREATE_DATABASE '0'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 493,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" SESSION_SECRET ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 494,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_SESSION_DAYS '30'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 495,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_FREE_PLAN_LIMIT '5'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 496,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" GOOGLE_CLIENT_ID ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 497,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" GOOGLE_CLIENT_SECRET ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 498,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_GOOGLE_TAG_ID ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 499,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_INDEXNOW_KEY ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 500,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" SMTP_HOST ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 501,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" SMTP_PORT '587'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 502,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" SMTP_USER ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 503,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" SMTP_PASSWORD ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 504,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" SMTP_FROM ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 505,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${env_file}\" SMTP_SECURE 'false'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 506,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_LIFETIME_PRICE ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 507,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_SHOP ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 508,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_PRO_MONTHLY_SHOP ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 509,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_AI_REVIEW_AUDIT_DB '/var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 510,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_MEDIA_STAGE_ROOT '/var/www/texise.com/texise-media'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 511,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_MEDIA_PUBLISHED_ROOT '/var/www/texise.com/public_html/dist/texise-media'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 512,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_BLOG_MEDIA_DIR '/var/www/texise.com/texise-media/blog'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 513,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_DOCS_MEDIA_DIR '/var/www/texise.com/texise-media/docs'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 514,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_PUBLIC_URL 'https://www.texise.com'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 515,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_IMAGE 'texlive/texlive:latest-full'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 516,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CONSOLE_IMAGE 'texlive/texlive-console:pro'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 517,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_LINUX_TERMINAL_ENABLED '1'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 518,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CONSOLE_GATEWAY_URL 'http://127.0.0.1:8787'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 519,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CONSOLE_GATEWAY_SECRET ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 520,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CONSOLE_MAX_UPLOAD_BYTES '50000000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 521,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CONSOLE_MAX_DOWNLOAD_BYTES '100000000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 522,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CONSOLE_SESSION_MINUTES '240'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 523,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_ENABLED '0'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 524,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_ALLOWED_ENGINES 'pdflatex,xelatex,lualatex'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 525,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_MAX_FILES '450'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 526,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_MAX_PROJECT_BYTES '25000000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 527,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_MAX_SECONDS '120'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 528,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_MAX_OUTPUT_BYTES '60000000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 529,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_CONCURRENCY '2'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 530,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_DAILY_ALLOWANCE '0'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 531,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_MONTHLY_ALLOWANCE '0'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 532,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_FREE_FALLBACK '1'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 533,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_WORKER_URL 'http://127.0.0.1:3001/api/compile'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 534,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_WORKER_SECRET ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 535,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_ensure_env_default \"${env_file}\" TEXISE_CLOUD_COMPILE_AUDIT_FILE '/var/www/texise.com/public_html/texise-data/audit/cloud-compile-quota.json'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 536,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_prepare_and_validate_saas_config \"${env_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 537,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ -n \"$(texise_env_value \"${env_file}\" TEXISE_GOOGLE_TAG_ID)\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 538,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Google Analytics tag configured.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 540,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Google Analytics tag: not configured'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 543,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "indexnow_key=\"$(texise_env_scalar_value \"${env_file}\" TEXISE_INDEXNOW_KEY)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 546,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_set_env_value \"${env_file}\" TEXISE_INDEXNOW_KEY \"${indexnow_key}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 547,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Generated a persistent IndexNow ownership key.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 549,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_die 'TEXISE_INDEXNOW_KEY must contain 8-128 letters, numbers or hyphens.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 552,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "free_plan_limit=\"$(texise_env_scalar_value \"${env_file}\" TEXISE_FREE_PLAN_LIMIT)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 554,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Invalid TEXISE_FREE_PLAN_LIMIT=${free_plan_limit}; restoring safe default 5.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 555,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_set_env_value \"${env_file}\" TEXISE_FREE_PLAN_LIMIT '5'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 558,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Free plan project limit: ${free_plan_limit}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 560,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# R14.23.0: migrate only TeXise-owned historical defaults. Administrator"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 564,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# TeXise-owned BusyTeX defaults. BusyTeX 1.4.0 added the Biber runtime that"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 565,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# TeXise's full compiler profile now requires, so preserved 1.3.x defaults"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 567,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_BUSY_COMPILER_VERSION '1.3.0' '1.4.0'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 568,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_BUSY_COMPILER_VERSION '1.3.1' '1.4.0'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 569,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_migrate_env_known_default \"${env_file}\" MYSQL_DATABASE 'texisecom_db' 'texise_db'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 570,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_PUBLIC_URL 'https://app.texise.com' 'https://www.texise.com'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 571,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_APP_URL 'https://app.texise.com' 'https://www.texise.com'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 572,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_FONT_SOURCE_DIR '/var/www/app.texise.com/fonts' '/var/www/texise.com/fonts'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 573,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_AI_REVIEW_AUDIT_DB '/var/www/app.texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3' '/var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 574,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_BLOG_MEDIA_DIR '/var/www/app.texise.com/public_html/texise-media/blog' '/var/www/texise.com/texise-media/blog'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 575,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_BLOG_MEDIA_DIR '/var/www/texise.com/public_html/texise-media/blog' '/var/www/texise.com/texise-media/blog'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 576,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_TEXLIVE_REMOTE_URL 'https://texlive.texlyre.org/' 'https://texlive2026.texlyre.org/'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 577,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_BUSY_TEXLIVE_ENDPOINT 'https://texlive.texlyre.org/' 'https://texlive2026.texlyre.org/'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 578,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_CLOUD_COMPILE_IMAGE 'texlive/texlive:latest' 'texlive/texlive:latest-full'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 585,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "compiler_profile=\"$(texise_env_scalar_value \"${env_file}\" TEXISE_COMPILER_PROFILE)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 586,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "busytex_full_endpoint=\"$(texise_env_scalar_value \"${env_file}\" TEXISE_BUSY_TEXLIVE_ENDPOINT)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 587,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texlive_remote_endpoint=\"$(texise_env_scalar_value \"${env_file}\" TEXISE_TEXLIVE_REMOTE_URL)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 594,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# already valid, otherwise restore the TeXise-owned full-tree default."
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 595,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_is_http_url \"${busytex_full_endpoint}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 596,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if texise_is_http_url \"${texlive_remote_endpoint}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 601,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_set_env_value \"${env_file}\" TEXISE_BUSY_TEXLIVE_ENDPOINT \"${busytex_full_endpoint}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 602,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Full compiler profile repaired TEXISE_BUSY_TEXLIVE_ENDPOINT=${busytex_full_endpoint}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 604,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_is_http_url \"${texlive_remote_endpoint}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 605,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if texise_is_http_url \"${busytex_full_endpoint}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 610,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_set_env_value \"${env_file}\" TEXISE_TEXLIVE_REMOTE_URL \"${texlive_remote_endpoint}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 611,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Full compiler profile repaired TEXISE_TEXLIVE_REMOTE_URL=${texlive_remote_endpoint}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 614,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "# The former shared TEXISE_EXECUTION_IMAGE architecture is retired. The two"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 618,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if grep -q '^TEXISE_EXECUTION_IMAGE=' \"${env_file}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 619,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "sed -i '/^TEXISE_EXECUTION_IMAGE=/d' \"${env_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 620,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log 'Retired legacy TEXISE_EXECUTION_IMAGE; Cloud Compile and Linux Terminal now use separate images.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 622,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if grep -q '^TEXISE_CONSOLE_REQUIRE_SCIENTIFIC_STACK=' \"${env_file}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 623,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "sed -i '/^TEXISE_CONSOLE_REQUIRE_SCIENTIFIC_STACK=/d' \"${env_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 624,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log 'Retired legacy TEXISE_CONSOLE_REQUIRE_SCIENTIFIC_STACK; the dedicated Pro console image is fully certified as one toolchain.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 626,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "# Writable runtime state must not live under /etc/texise: systemd intentionally"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 627,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# exposes that directory read-only to the texise service. Migrate only the"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 628,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# historical TeXise-owned default; administrator custom paths are preserved."
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 629,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_AI_REVIEW_AUDIT_DB '/etc/texise/ai-review-audit.sqlite3' '/var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 630,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_AI_REVIEW_AUDIT_DB '/var/lib/texise/ai-review-audit.sqlite3' '/var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 631,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_migrate_env_known_default \"${env_file}\" TEXISE_BLOG_MEDIA_DIR '/var/lib/texise-media/blog' '/var/www/texise.com/texise-media/blog'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 634,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g texise -m 0640 \"${TEXISE_SOURCE_ROOT}/deploy/config/config.json\" \"${config_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 636,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise \"${config_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 638,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Preserving ${config_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 642,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "install -o root -g texise -m 0640 /dev/null \"${license_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 644,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "chown root:texise \"${license_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 646,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "texise_log \"Preserving ${license_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 650,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_signing_keys() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 651,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local private_key=\"${TEXISE_CONFIG_DIR}/entitlement-private.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 652,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local public_key=\"${TEXISE_CONFIG_DIR}/entitlement-public.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 655,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Preserving ${private_key}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 657,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Preserving ${public_key}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 659,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Regenerating missing ${public_key} from the preserved private key\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 663,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log 'Generating TeXise Ed25519 entitlement signing keypair'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 669,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise \"${private_key}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 671,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "# Keep every /etc/texise cryptographic/configuration artifact within the"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 672,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# same root:texise trust boundary. The public key is not secret, but 0640"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 675,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise \"${public_key}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 678,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local refresh_key=\"${TEXISE_CONFIG_DIR}/entitlement-refresh.key\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 680,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log 'Generating TeXise stateless licence refresh encryption key'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 684,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Preserving ${refresh_key}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 686,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise \"${refresh_key}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 691,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_compiler_profile() ("
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 692,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ -r \"${TEXISE_CONFIG_DIR}/texise.env\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 695,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "source \"${TEXISE_CONFIG_DIR}/texise.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 698,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "printf '%s' \"${TEXISE_COMPILER_PROFILE:-full}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 701,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_validate_font_file() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 703,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "node - \"${font_file}\" <<'NODE' || texise_die \"Invalid or unreadable font file: ${font_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 715,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_font_source() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 733,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_browser_fonts() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 735,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ -r \"${TEXISE_CONFIG_DIR}/texise.env\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 736,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "configured_source=\"$(texise_env_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_FONT_SOURCE_DIR)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 738,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local source_dir=\"${configured_source:-${TEXISE_FONT_SOURCE_DIR}}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 739,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local target_dir=\"${TEXISE_DIST_DIR}/texise-fonts\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 740,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -d \"${source_dir}\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 741,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"Required external font directory is missing: ${source_dir}. Restore the TeXise font set beside public_html before installing.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 744,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "inter=\"$(texise_font_source \"${source_dir}\" 'Inter-Variable.woff2')\" || texise_die \"Missing required font: ${source_dir}/Inter-Variable.woff2\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 745,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "jetbrains=\"$(texise_font_source \"${source_dir}\" 'JetBrainsMono-Variable.woff2')\" || texise_die \"Missing required font: ${source_dir}/JetBrainsMono-Variable.woff2\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 746,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "moranga_light=\"$(texise_font_source \"${source_dir}\" 'moranga-light.otf' 'Moranga-Light.otf')\" || texise_die \"Missing required font: ${source_dir}/moranga-light.otf\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 747,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "moranga_regular=\"$(texise_font_source \"${source_dir}\" 'Moranga-Regular.otf' 'Latinotype - Moranga Regular.otf')\" || texise_die \"Missing required font: ${source_dir}/Moranga-Regular.otf\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 748,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "moranga_italic=\"$(texise_font_source \"${source_dir}\" 'moranga-regular-italic.otf' 'Moranga-RegularItalic.otf')\" || texise_die \"Missing required font: ${source_dir}/moranga-regular-italic.otf\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 749,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "moranga_bold=\"$(texise_font_source \"${source_dir}\" 'moranga-bold.otf' 'Moranga-Bold.otf')\" || texise_die \"Missing required font: ${source_dir}/moranga-bold.otf\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 750,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "stix_normal=\"$(texise_font_source \"${source_dir}\" 'STIXTwoText-VariableFont.ttf' 'STIXTwoText-VariableFont_wght.ttf')\" || texise_die \"Missing required font: ${source_dir}/STIXTwoText-VariableFont.ttf\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 751,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "stix_italic=\"$(texise_font_source \"${source_dir}\" 'STIXTwoText-Italic-Variable.ttf' 'STIXTwoText-Italic-VariableFont_wght.ttf')\" || texise_die \"Missing required font: ${source_dir}/STIXTwoText-Italic-Variable.ttf\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 755,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_validate_font_file \"${source_font}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 778,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_validate_font_file \"${target_dir}/${deployed_font}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 780,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log \"Installed and verified all 8 TeXise browser fonts from ${source_dir}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 783,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_dependencies() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 784,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Installing repository dependencies from the pinned lockfile'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 786,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cd \"${TEXISE_SOURCE_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 790,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_pnpm install --frozen-lockfile"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 794,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_validate_production_dist() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 806,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-texlive-sw.js \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 807,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-icons/app-icon-180.png \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 808,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-icons/app-icon-192.png \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 809,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-icons/app-icon-512.png \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 810,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-icons/lucide-category-icons.svg \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 811,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-icons/lucide-category-icons.json \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 812,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-icons/lucide/file-text.svg \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 820,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-templates/templates.json \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 821,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-templates/categories.json \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 822,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-fonts/Inter-Variable.woff2 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 823,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-fonts/JetBrainsMono-Variable.woff2 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 824,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-fonts/Moranga-Light.otf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 825,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-fonts/Moranga-Regular.otf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 826,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-fonts/Moranga-RegularItalic.otf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 827,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-fonts/Moranga-Bold.otf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 828,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-fonts/STIXTwoText-VariableFont.ttf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 829,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise-fonts/STIXTwoText-Italic-Variable.ttf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 835,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_DIST_DIR}/${required_file}\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 836,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Production browser build is missing ${TEXISE_DIST_DIR}/${required_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 839,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -d \"${TEXISE_DIST_DIR}/${required_dir}\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 840,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Production browser build is missing ${TEXISE_DIST_DIR}/${required_dir}/\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 842,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if [[ \"$(texise_compiler_profile)\" == \"full\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 856,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_DIST_DIR}/compiler/busytex/${busytex_required}\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 859,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/patch-busytex-runtime.mjs\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 860,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_DIST_DIR}/compiler/busytex\" || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 861,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'Production BusyTeX runtime does not satisfy the TeXise v1.4 Biber ABI contract.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 862,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ \"${TEXISE_DEPLOY_CERTIFY}\" == \"1\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 863,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_DIST_DIR}/release/certification.json\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 865,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node - \"${TEXISE_DIST_DIR}/release.json\" \"${TEXISE_DIST_DIR}/release/certification.json\" <<'NODE' || texise_die 'Runtime browser certification does not match the production release.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 876,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ ! -e \"${TEXISE_DIST_DIR}/templates\" ]] || texise_die     'Production dist contains legacy dist/templates, which would shadow the /templates SPA route.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 877,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ ! -e \"${TEXISE_TEMPLATE_PUBLIC_COPY}/free\" && ! -e \"${TEXISE_TEMPLATE_PUBLIC_COPY}/pro\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 880,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "entitlement_key_id=\"$(node -e 'const fs=require(\"node:fs\");const c=require(\"node:crypto\");const p=fs.readFileSync(process.argv[1],\"utf8\");const der=c.createPublicKey(p).export({type:\"spki\",format:\"der\"});process.stdout.write(\"ed25519:\"+c.createHash(\"sha256\").update(der).digest(\"hex\").slice(0,16));' \"${TEXISE_CONFIG_DIR}/entitlement-public.pem\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 881,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "grep -R --fixed-strings --quiet \"${entitlement_key_id}\" \"${TEXISE_DIST_DIR}/assets\" || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 885,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_legacy_template_namespace() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 886,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local canonical_root=\"${TEXISE_SOURCE_ROOT}/texise-templates\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 887,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local canonical_public=\"${TEXISE_SOURCE_ROOT}/packages/tooling/browser-entry/public/texise-templates\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 888,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -d \"${canonical_root}\" ]] || texise_die \"Canonical template source is missing: ${canonical_root}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 889,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -d \"${canonical_public}\" ]] || texise_die \"Canonical browser template source is missing: ${canonical_public}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 893,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_SOURCE_ROOT}/templates\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 894,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_SOURCE_ROOT}/packages/tooling/browser-entry/public/templates\"; do"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 896,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_die \"Refusing to remove symlinked legacy template namespace: ${legacy}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 899,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -d \"${legacy}\" ]] || texise_die \"Legacy template namespace is not a directory: ${legacy}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 900,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Removing legacy template namespace ${legacy}; canonical assets live under texise-templates/.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 906,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_publish_indexnow_key_file() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 908,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "key=\"$(texise_env_scalar_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_INDEXNOW_KEY)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 909,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ \"${key}\" =~ ^[A-Za-z0-9-]{8,128}$ ]] || texise_die 'Cannot publish invalid TEXISE_INDEXNOW_KEY.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 910,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "printf '%s' \"${key}\" > \"${TEXISE_DIST_DIR}/${key}.txt\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 911,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "chmod 0644 \"${TEXISE_DIST_DIR}/${key}.txt\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 912,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Published IndexNow ownership file /${key}.txt.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 915,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_build_frontend() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 916,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Building browser application into ${TEXISE_DIST_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 918,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cd \"${TEXISE_SOURCE_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 920,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "# root-owned env file so preserved /etc/texise settings actually control"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 924,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "source \"${TEXISE_CONFIG_DIR}/texise.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 926,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export TEXISE_ENTITLEMENT_PUBLIC_KEY_PEM"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 927,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_PUBLIC_KEY_PEM=\"$(cat \"${TEXISE_CONFIG_DIR}/entitlement-public.pem\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 928,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export TEXISE_ENTITLEMENT_KEY_ID"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 929,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_KEY_ID=\"$(node -e 'const fs=require(\"node:fs\");const c=require(\"node:crypto\");const p=fs.readFileSync(process.argv[1],\"utf8\");const der=c.createPublicKey(p).export({type:\"spki\",format:\"der\"});process.stdout.write(\"ed25519:\"+c.createHash(\"sha256\").update(der).digest(\"hex\").slice(0,16));' \"${TEXISE_CONFIG_DIR}/entitlement-public.pem\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 930,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -n \"${TEXISE_ENTITLEMENT_PUBLIC_KEY_PEM}\" ]] || texise_die 'Unable to load entitlement public key for browser trust pinning.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 931,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -n \"${TEXISE_ENTITLEMENT_KEY_ID}\" ]] || texise_die 'Unable to derive entitlement key identifier.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 932,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export TEXISE_BUSY_COMPILER_CACHE_ABI=\"${TEXISE_BUSY_COMPILER_CACHE_ABI:-v14-biber-abi2}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 933,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export TEXISE_BUSY_COMPILER_CACHE_DIR=\"${TEXISE_BUSY_COMPILER_CACHE_DIR:-${TEXISE_COMPILER_CACHE_DIR}/busytex-${TEXISE_BUSY_COMPILER_VERSION:-1.4.0}-${TEXISE_BUSY_COMPILER_CACHE_ABI}}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 935,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "# BF50.7: /var/www/texise.com/templates is the complete persistent,"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 938,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_prepare_persistent_template_library"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 939,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_TEMPLATE_ROOT=\"${TEXISE_TEMPLATE_ROOT}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 941,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "--root=\"${TEXISE_TEMPLATE_ROOT}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 942,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "--public-copy=\"${TEXISE_SOURCE_ROOT}/packages/tooling/browser-entry/public/texise-templates\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 943,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_sync_persistent_template_source_mirror"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 962,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_legacy_template_namespace"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 968,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ \"${TEXISE_DEPLOY_CERTIFY}\" == \"1\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 978,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_pnpm run lint:ci"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 979,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ \"${TEXISE_COMPILER_PROFILE:-full}\" == \"full\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 987,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "node scripts/texise-release-audit.mjs"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 988,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export TEXISE_APP_ENV=production"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 989,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_pnpm run build"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 991,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ \"${TEXISE_COMPILER_PROFILE:-full}\" == \"full\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 995,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node scripts/patch-busytex-runtime.mjs \"${TEXISE_DIST_DIR}/compiler/busytex\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1001,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_browser_fonts"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1002,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_publish_indexnow_key_file"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1003,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_validate_production_dist"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1004,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "chmod -R a-w \"${TEXISE_DIST_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1008,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_saas_preflight_runtime() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1010,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if ! texise_saas_requested \"${TEXISE_CONFIG_DIR}/texise.env\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1014,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -f \"${runtime_server}/saas-preflight.mjs\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1016,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_command systemd-run"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1017,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Running SaaS MySQL/migrations/admin preflight before trusted-runtime activation.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1018,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "local unit=\"texise-saas-preflight-$$-${RANDOM}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1021,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--property=User=texise \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1022,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--property=Group=texise \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1024,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "--property=\"EnvironmentFile=${TEXISE_CONFIG_DIR}/texise.env\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1027,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_die 'SaaS preflight failed before activation. Verify MYSQL_HOST/MYSQL_PORT/MYSQL_DATABASE/MYSQL_USER/MYSQL_PASSWORD and database grants in /etc/texise/texise.env. Run `journalctl -u texise.service -n 100 --no-pager` for the current service and retry after correcting the database configuration.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1031,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_activate_runtime_server() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1033,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "release_id=\"$(node -e 'const fs=require(\"node:fs\");const p=JSON.parse(fs.readFileSync(process.argv[1],\"utf8\"));process.stdout.write(p.releaseId)' \"${TEXISE_DIST_DIR}/release.json\")\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1034,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -n \"${release_id}\" ]] || texise_die 'Production release metadata does not contain releaseId.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1036,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "rm -rf \"${TEXISE_RUNTIME_NEXT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1037,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o root -g root -m 0755 \"${TEXISE_RUNTIME_NEXT}/server\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1038,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cp -a \"${TEXISE_SOURCE_ROOT}/server/.\" \"${TEXISE_RUNTIME_NEXT}/server/\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1044,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_SOURCE_ROOT}/packages/core/app/src/saas/compare-content.json\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1045,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_RUNTIME_NEXT}/server/compare-content.json\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1049,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SOURCE_ROOT=\"${TEXISE_SOURCE_ROOT}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1050,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_TEMPLATE_ROOT=\"${TEXISE_TEMPLATE_ROOT}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1051,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_TEMPLATE_PUBLIC_COPY=\"${TEXISE_TEMPLATE_PUBLIC_COPY}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1052,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/check-staged-trusted-runtime.mjs\" \"${TEXISE_RUNTIME_NEXT}/server\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1058,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if texise_saas_requested \"${TEXISE_CONFIG_DIR}/texise.env\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1059,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Installing pinned trusted-server SaaS runtime dependencies.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1061,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cd \"${TEXISE_RUNTIME_NEXT}/server\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1064,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_saas_preflight_runtime \"${TEXISE_RUNTIME_NEXT}/server\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1069,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o root -g root -m 0755 \"${TEXISE_RUNTIME_NEXT}/server/node_modules\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1072,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -d \"${TEXISE_SOURCE_ROOT}/node_modules/${runtime_dependency}\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1075,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_SOURCE_ROOT}/node_modules/${runtime_dependency}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1076,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_RUNTIME_NEXT}/server/node_modules/${runtime_dependency}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1080,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "printf 'TEXISE_RELEASE_ID=%s\\n' \"${release_id}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1081,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "printf 'TEXISE_SOURCE_ROOT=%s\\n' \"${TEXISE_SOURCE_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1082,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "printf 'TEXISE_TEMPLATE_ROOT=%s\\n' \"${TEXISE_TEMPLATE_ROOT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1083,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "printf 'TEXISE_TEMPLATE_PUBLIC_COPY=%s\\n' \"${TEXISE_TEMPLATE_PUBLIC_COPY}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1084,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "} > \"${TEXISE_RUNTIME_NEXT}/release.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1085,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "chmod 0644 \"${TEXISE_RUNTIME_NEXT}/release.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1087,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "rm -rf \"${TEXISE_RUNTIME_PREVIOUS}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1088,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ -d \"${TEXISE_RUNTIME_CURRENT}\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1089,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "mv \"${TEXISE_RUNTIME_CURRENT}\" \"${TEXISE_RUNTIME_PREVIOUS}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1091,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "mv \"${TEXISE_RUNTIME_NEXT}\" \"${TEXISE_RUNTIME_CURRENT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1092,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "chmod -R a-w \"${TEXISE_RUNTIME_CURRENT}/server\" \"${TEXISE_RUNTIME_CURRENT}/release.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1093,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Activated trusted API runtime ${release_id}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1096,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_restore_previous_runtime() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1097,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ ! -d \"${TEXISE_RUNTIME_PREVIOUS}\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1098,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'No previous trusted API runtime is available for rollback.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1101,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Restoring previous trusted API runtime after failed deployment health checks.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1102,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "rm -rf \"${TEXISE_RUNTIME_CURRENT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1103,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "mv \"${TEXISE_RUNTIME_PREVIOUS}\" \"${TEXISE_RUNTIME_CURRENT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1104,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl restart texise.service >/dev/null 2>&1 || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1108,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_admin_cli() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1109,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "install -o root -g root -m 0755 \"${TEXISE_SOURCE_ROOT}/scripts/texise-license\" /usr/local/bin/texise-license"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1110,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g root -m 0755 \"${TEXISE_SOURCE_ROOT}/scripts/texise-saas\" /usr/local/bin/texise-saas"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1113,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_quiesce_service_for_dependency_install() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1118,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Quiescing ${service_name} while its locked Node dependencies are replaced.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_verify_execution_workspace_access() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1128,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "local unit=\"texise-workspace-probe-${user_name//[^a-zA-Z0-9]/-}-$$-${RANDOM}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1133,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "--setenv=\"TEXISE_WORKSPACE_PROBE=${workspace}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1134,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "/usr/bin/python3 -c 'import os; from pathlib import Path; root=Path(os.environ[\"TEXISE_WORKSPACE_PROBE\"]); probe=root/(\".texise-write-probe-\"+str(os.getpid())); probe.write_bytes(b\"ok\"); probe.unlink()'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1135,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_die \"${label} service account ${user_name} cannot write its workspace ${workspace}. Check parent traversal ownership/modes before retrying.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1139,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_harden_service_node_modules() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1143,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -f \"${service_dir}/node_modules/${dependency_marker}/package.json\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1153,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_docker_image() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1156,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -n \"${image}\" ]] || texise_die \"${label} Docker image is empty.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1158,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"${label} Docker image is available locally: ${image}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1161,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Pulling ${label} Docker image: ${image}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1162,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "docker pull \"${image}\" >/dev/null || texise_die \"Unable to pull ${label} Docker image ${image}. If it is private, authenticate Docker or preload the image before retrying.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1163,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "docker image inspect \"${image}\" >/dev/null 2>&1 || texise_die \"${label} Docker image is still unavailable after pull: ${image}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1166,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_console_image() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1168,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -n \"${image}\" ]] || texise_die 'TexLab Docker image is empty.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1170,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# texlive/texlive-console:pro is a TeXise-local production image name, not a"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1175,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "current_schema=\"$(docker image inspect --format '{{ index .Config.Labels \"com.texise.image.schema\" }}' \"${image}\" 2>/dev/null || true)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1176,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ \"${current_schema}\" == \"${TEXISE_CONSOLE_IMAGE_SCHEMA}\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1177,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"TexLab Docker image is already built and current: ${image} (${current_schema})\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1180,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Rebuilding TexLab Docker image ${image}; installed schema=${current_schema:-unlabeled}, required=${TEXISE_CONSOLE_IMAGE_SCHEMA}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1182,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log \"Building TeXise-local TexLab Docker image: ${image}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1185,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_CONSOLE_IMAGE_CONTEXT}/Dockerfile\" ]] || texise_die       \"TexLab Dockerfile is missing: ${TEXISE_CONSOLE_IMAGE_CONTEXT}/Dockerfile\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1186,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_CONSOLE_IMAGE_CONTEXT}/requirements-scientific.txt\" ]] || texise_die       \"TexLab scientific requirements are missing: ${TEXISE_CONSOLE_IMAGE_CONTEXT}/requirements-scientific.txt\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1190,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_docker_image 'texlive/texlive:latest' 'TexLab base'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1191,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "docker build       --pull=false       --build-arg BASE_IMAGE='texlive/texlive:latest'       --tag \"${image}\"       \"${TEXISE_CONSOLE_IMAGE_CONTEXT}\" || texise_die         \"Unable to build TexLab Docker image ${image}. Inspect the Docker build output above.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1194,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "built_schema=\"$(docker image inspect --format '{{ index .Config.Labels \"com.texise.image.schema\" }}' \"${image}\" 2>/dev/null || true)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1195,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ \"${built_schema}\" == \"${TEXISE_CONSOLE_IMAGE_SCHEMA}\" ]] || texise_die       \"TexLab image ${image} built without the expected schema label ${TEXISE_CONSOLE_IMAGE_SCHEMA}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1196,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"TexLab Docker image built and verified locally: ${image} (${built_schema})\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1202,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_docker_image \"${image}\" 'TexLab'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1205,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_cloud_compile() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1206,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local trusted_env=\"${TEXISE_CONFIG_DIR}/texise.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1207,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "local legacy_env=\"/etc/texise-latex-compile.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1208,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local worker_env=\"${TEXISE_CLOUD_COMPILE_ENV}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1210,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_CLOUD_COMPILE_DIR}/server.js\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1211,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Cloud Compile source is missing: ${TEXISE_CLOUD_COMPILE_DIR}/server.js\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1212,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_CLOUD_COMPILE_DIR}/package-lock.json\" ]] || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1213,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Cloud Compile lockfile is missing: ${TEXISE_CLOUD_COMPILE_DIR}/package-lock.json\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1217,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g texise-compile -m 0640 \"${legacy_env}\" \"${worker_env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1218,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Migrated the existing Cloud Compile environment from ${legacy_env}; the legacy file was preserved for rollback.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1220,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g texise-compile -m 0640 \"${TEXISE_SOURCE_ROOT}/deploy/config/cloud-compile.env.example\" \"${worker_env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1223,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise-compile \"${worker_env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1225,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Preserving ${worker_env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1228,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" NODE_ENV 'production'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1229,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" BIND_HOST '127.0.0.1'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1230,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" PORT '3001'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1231,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_API_SECRET ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1232,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_BACKEND 'docker'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1233,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_DOCKER_IMAGE 'texlive/texlive:latest-full'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1234,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_ALLOWED_ENGINES 'pdflatex,xelatex,lualatex'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1235,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_TIMEOUT_MS '120000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1236,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_MAX_FILES '450'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1237,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_MAX_TOTAL_BYTES '25000000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1238,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_MAX_OUTPUT_BYTES '60000000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1239,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_CONCURRENCY '2'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1240,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_RATE_LIMIT_PER_MINUTE '60'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1241,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_CPU '1.5'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1242,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_MEMORY '1g'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1243,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_PIDS_LIMIT '256'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1244,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_WORK_DIR \"${TEXISE_CLOUD_COMPILE_TMP}/jobs\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1245,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_JOB_TTL_MS '1800000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1246,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_SCAVENGE_INTERVAL_MS '600000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1247,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_AUTO_FALLBACK_XELATEX 'false'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1248,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${worker_env}\" COMPILE_KEEP_FAILED 'false'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1249,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_env_known_default \"${worker_env}\" COMPILE_WORK_DIR '/var/lib/texise-latex-compile/jobs' \"${TEXISE_CLOUD_COMPILE_TMP}/jobs\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1250,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_migrate_env_known_default \"${worker_env}\" COMPILE_DOCKER_IMAGE 'texise/console-texlive-full:latest' 'texlive/texlive:latest-full'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1251,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_migrate_env_known_default \"${worker_env}\" COMPILE_DOCKER_IMAGE 'texlive/texlive:latest' 'texlive/texlive:latest-full'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1253,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cloud_image=\"$(texise_env_value \"${trusted_env}\" TEXISE_CLOUD_COMPILE_IMAGE)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1255,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_set_env_value \"${trusted_env}\" TEXISE_CLOUD_COMPILE_IMAGE \"${cloud_image}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1256,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_set_env_value \"${worker_env}\" COMPILE_DOCKER_IMAGE \"${cloud_image}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1257,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_docker_image \"${cloud_image}\" 'Cloud Compile'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1260,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "trusted_secret=\"$(texise_env_value \"${trusted_env}\" TEXISE_CLOUD_COMPILE_WORKER_SECRET)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1261,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "worker_secret=\"$(texise_env_value \"${worker_env}\" COMPILE_API_SECRET)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1263,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_die 'Cloud Compile secret mismatch between /etc/texise/texise.env and /etc/texise/cloud-compile.env. Reconcile the existing operator values before upgrading.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1268,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Generated a private trusted-API ↔ Cloud Compile worker secret.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1274,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_set_env_value \"${trusted_env}\" TEXISE_CLOUD_COMPILE_WORKER_SECRET \"${trusted_secret}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1275,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_set_env_value \"${worker_env}\" COMPILE_API_SECRET \"${worker_secret}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1276,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise \"${trusted_env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1278,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise-compile \"${worker_env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1284,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_quiesce_service_for_dependency_install texise-latex-compile.service"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1286,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cd \"${TEXISE_CLOUD_COMPILE_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1289,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_harden_service_node_modules \"${TEXISE_CLOUD_COMPILE_DIR}\" express 'Cloud Compile'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1290,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_verify_execution_workspace_access texise-compile texise-compile \"${TEXISE_CLOUD_COMPILE_TMP}/jobs\" 'Cloud Compile'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1292,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g root -m 0644 \"${TEXISE_SOURCE_ROOT}/deploy/systemd/texise-latex-compile.service\" \"${TEXISE_CLOUD_COMPILE_SYSTEMD_UNIT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1295,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_console_egress_network() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1298,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_command docker"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1299,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_command iptables"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1301,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Creating controlled Learnitive terminal egress network ${network_name}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1321,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_console_gateway() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1322,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local trusted_env=\"${TEXISE_CONFIG_DIR}/texise.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1323,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local legacy_env=\"/opt/texise-console-gateway/.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1324,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local gateway_env=\"${TEXISE_CONSOLE_ENV}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1325,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_CONSOLE_DIR}/server.js\" ]] || texise_die \"Console Gateway source is missing: ${TEXISE_CONSOLE_DIR}/server.js\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1326,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -f \"${TEXISE_CONSOLE_DIR}/package-lock.json\" ]] || texise_die \"Console Gateway lockfile is missing: ${TEXISE_CONSOLE_DIR}/package-lock.json\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1329,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g texise-console -m 0640 \"${legacy_env}\" \"${gateway_env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1330,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Migrated existing Console Gateway environment from ${legacy_env}; legacy file preserved.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1332,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g texise-console -m 0640 \"${TEXISE_SOURCE_ROOT}/deploy/config/console-gateway.env.example\" \"${gateway_env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1335,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" NODE_ENV 'production'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1336,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" BIND_HOST '127.0.0.1'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1337,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" PORT '8787'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1338,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_GATEWAY_SECRET ''"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1339,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_IMAGE 'texlive/texlive-console:pro'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1340,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_DOCKER_BIN '/usr/bin/docker'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1341,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_env_known_default \"${gateway_env}\" TEXISE_CONSOLE_NETWORK 'bridge' 'learnitive-egress'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1342,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_NETWORK 'learnitive-egress'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1343,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_MEMORY '2g'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1344,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_CPUS '2'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1345,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_PIDS_LIMIT '256'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1346,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_WORK_DIR \"${TEXISE_CONSOLE_TMP}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1347,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_SESSION_SECONDS '14400'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1348,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_IDLE_SECONDS '1800'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1349,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_TOKEN_SECONDS '300'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1350,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_MAX_SESSIONS '8'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1351,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_MAX_SESSIONS_PER_USER '2'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1352,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_MAX_FILES '1000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1353,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_MAX_UPLOAD_BYTES '50000000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_MAX_DOWNLOAD_BYTES '100000000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1355,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_MAX_WORKSPACE_BYTES '1000000000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1356,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_RATE_LIMIT_PER_MINUTE '120'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1357,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_RATE_BUCKET_CAP '1000'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1358,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_env_default \"${gateway_env}\" LEARNITIVE_CONSOLE_QUOTA_CHECK_SECONDS '5'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1361,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "trusted_secret=\"$(texise_env_value \"${trusted_env}\" LEARNITIVE_CONSOLE_GATEWAY_SECRET)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1362,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -n \"${trusted_secret}\" ]] || trusted_secret=\"$(texise_env_value \"${trusted_env}\" TEXISE_CONSOLE_GATEWAY_SECRET)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1363,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "gateway_secret=\"$(texise_env_value \"${gateway_env}\" LEARNITIVE_CONSOLE_GATEWAY_SECRET)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1364,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -n \"${gateway_secret}\" ]] || gateway_secret=\"$(texise_env_value \"${gateway_env}\" TEXISE_CONSOLE_GATEWAY_SECRET)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1366,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_die 'Console Gateway secret mismatch between trusted API and gateway environment.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1370,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Generated a private trusted-API ↔ Console Gateway secret.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1372,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console_image=\"$(texise_env_value \"${trusted_env}\" LEARNITIVE_CONSOLE_IMAGE)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1373,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -n \"${console_image}\" ]] || console_image=\"$(texise_env_value \"${trusted_env}\" TEXISE_CONSOLE_IMAGE)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1376,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_set_env_value \"${trusted_env}\" LEARNITIVE_CONSOLE_GATEWAY_SECRET \"${trusted_secret}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1377,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_set_env_value \"${trusted_env}\" TEXISE_CONSOLE_GATEWAY_SECRET \"${trusted_secret}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1378,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_set_env_value \"${gateway_env}\" LEARNITIVE_CONSOLE_GATEWAY_SECRET \"${gateway_secret}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1379,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_set_env_value \"${gateway_env}\" TEXISE_CONSOLE_GATEWAY_SECRET \"${gateway_secret}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1380,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_set_env_value \"${gateway_env}\" LEARNITIVE_CONSOLE_IMAGE \"${console_image}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1381,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_set_env_value \"${gateway_env}\" TEXISE_CONSOLE_IMAGE \"${console_image}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1382,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "sed -i '/^TEXISE_EXECUTION_IMAGE=/d' \"${gateway_env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1383,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_console_image \"${console_image}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1384,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_ensure_console_egress_network"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1385,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise \"${trusted_env}\"; chmod 0640 \"${trusted_env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1386,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise-console \"${gateway_env}\"; chmod 0640 \"${gateway_env}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1389,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_quiesce_service_for_dependency_install texise-console-gateway.service"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1391,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cd \"${TEXISE_CONSOLE_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1394,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_harden_service_node_modules \"${TEXISE_CONSOLE_DIR}\" node-pty 'Console Gateway'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1395,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_verify_execution_workspace_access texise-console texise-console \"${TEXISE_CONSOLE_TMP}\" 'Console Gateway'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1396,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g root -m 0644 \"${TEXISE_SOURCE_ROOT}/deploy/systemd/texise-console-gateway.service\" \"${TEXISE_CONSOLE_SYSTEMD_UNIT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1399,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_systemd() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1400,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g root -m 0644 \"${TEXISE_SOURCE_ROOT}/deploy/systemd/texise.service\" \"${TEXISE_SYSTEMD_UNIT}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1401,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_cloud_compile"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1402,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_console_gateway"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1404,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl enable texise.service >/dev/null"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1405,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl enable texise-latex-compile.service >/dev/null"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1406,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl enable texise-console-gateway.service >/dev/null"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1409,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_retire_legacy_services() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1411,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "for service in texise-collab.service texise-reverb.service; do"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1414,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Retiring legacy ${service}; its unit file and source tree are preserved for rollback.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1415,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl disable --now \"${service}\" >/dev/null 2>&1 || texise_log \"Warning: ${service} could not be stopped/disabled automatically; inspect it manually.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1417,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Legacy ${service} is already inactive; preserving its unit/source as rollback material.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1423,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_certificate_covers_host() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1432,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_find_certificate_for_host() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1439,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if texise_certificate_covers_host \"${cert}\" \"${host}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1447,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_apache() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1448,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local primary_cert=\"/etc/letsencrypt/live/texise.com/fullchain.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1449,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local primary_key=\"/etc/letsencrypt/live/texise.com/privkey.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1451,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local main_stage=\"${TEXISE_TMP_DIR}/texise.com.conf.next\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1452,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local app_stage=\"${TEXISE_TMP_DIR}/app.texise.com-redirect.conf.next\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1454,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cat \"${TEXISE_SOURCE_ROOT}/deploy/apache/texise.com-http.conf\" > \"${main_stage}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1456,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_certificate_covers_host \"${primary_cert}\" texise.com || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1457,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"Primary TLS certificate ${primary_cert} does not contain texise.com.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1458,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_certificate_covers_host \"${primary_cert}\" www.texise.com || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1459,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"Primary TLS certificate ${primary_cert} does not contain www.texise.com.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1461,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cat \"${TEXISE_SOURCE_ROOT}/deploy/apache/texise.com-https.conf\" >> \"${main_stage}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1464,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log 'Primary texise.com certificate is not readable; installing the direct HTTP→www redirect only. Production certification requires TLS.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1467,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cat \"${TEXISE_SOURCE_ROOT}/deploy/apache/app.texise.com-redirect-http.conf\" > \"${app_stage}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1468,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if app_pair=\"$(texise_find_certificate_for_host app.texise.com)\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1472,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "sed -e \"s|__TEXISE_APP_CERT__|${app_cert}|g\" -e \"s|__TEXISE_APP_KEY__|${app_key}|g\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1473,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"${TEXISE_SOURCE_ROOT}/deploy/apache/app.texise.com-redirect-https.conf\" >> \"${app_stage}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1475,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Discovered an existing app.texise.com TLS certificate at ${app_cert}; the legacy hostname will be redirect-only.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1477,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log 'No certificate covering app.texise.com was discovered. HTTP compatibility redirect will be installed; an HTTPS redirect cannot be certified safely without a matching certificate.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1480,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g root -m 0644 \"${main_stage}\" \"${TEXISE_APACHE_SITE}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1481,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -o root -g root -m 0644 \"${app_stage}\" \"${TEXISE_APP_REDIRECT_SITE}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1490,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# In particular, Certbot's historical texise.com-le-ssl.conf serves the"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1491,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "# source root (/var/www/texise.com/public_html) rather than dist. If it is"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1492,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# left enabled alongside the canonical vhost, www.texise.com:443 can be"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1498,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise.com-le-ssl.conf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1499,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "app.texise.com.conf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1500,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "app.texise.com-le-ssl.conf; do"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1502,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Disabling legacy/conflicting Apache site ${legacy_site}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1506,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "a2ensite \"$(basename \"${TEXISE_APACHE_SITE}\")\" >/dev/null"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1507,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "a2ensite \"$(basename \"${TEXISE_APP_REDIRECT_SITE}\")\" >/dev/null"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1512,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_copy_verify_tree() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1516,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "install -d -o texise -g texise -m 0755 \"${destination_dir}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1522,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "install -d -o texise -g texise -m 0755 \"${destination_parent}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1524,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "cmp -s \"${source_file}\" \"${destination_file}\" || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1528,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "chown texise:texise \"${destination_file}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1530,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "cmp -s \"${source_file}\" \"${destination_file}\" || texise_die \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1535,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_legacy_server_storage() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1536,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local env_file=\"${TEXISE_CONFIG_DIR}/texise.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1538,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "configured_db=\"$(texise_env_value \"${env_file}\" TEXISE_AI_REVIEW_AUDIT_DB)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1539,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local new_db=\"${TEXISE_AUDIT_DIR}/ai-review-audit.sqlite3\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1543,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl stop texise.service >/dev/null 2>&1 || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1545,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if [[ \"${configured_db}\" == \"${new_db}\" || \"${configured_db}\" == \"/var/www/app.texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1547,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "for old_db in \"${TEXISE_CONFIG_DIR}/ai-review-audit.sqlite3\" \"${TEXISE_LEGACY_DATA_DIR}/ai-review-audit.sqlite3\"; do"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1550,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "install -d -o texise -g texise -m 0750 \"${TEXISE_AUDIT_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1552,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "chown texise:texise \"${new_db}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1554,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "cmp -s \"${old_db}\" \"${new_db}\" || texise_die \"AI Review audit DB migration verification failed: ${old_db}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1558,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "chown texise:texise \"${new_db}${suffix}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1562,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Migrated AI Review audit DB into ${new_db}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1564,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Legacy AI Review DB ${old_db} differs from the active ${new_db}; preserving both and leaving the active public_html DB authoritative.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1569,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if [[ -d /var/www/app.texise.com/public_html/texise-media/blog ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1570,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Migrating legacy Blog media into ${TEXISE_BLOG_MEDIA_DIR}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1571,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_copy_verify_tree /var/www/app.texise.com/public_html/texise-media/blog \"${TEXISE_BLOG_MEDIA_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1572,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Legacy Blog media migration verified byte-for-byte.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1576,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_cleanup_legacy_server_storage() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1577,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "# The whole /var/www/app.texise.com tree remains rollback material after the"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1580,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log 'Preserving /var/www/app.texise.com as rollback material; no legacy app-root files were deleted.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1581,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local old_db=\"${TEXISE_LEGACY_DATA_DIR}/ai-review-audit.sqlite3\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1582,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local new_db=\"${TEXISE_AUDIT_DIR}/ai-review-audit.sqlite3\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1586,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "rmdir \"${TEXISE_LEGACY_DATA_DIR}\" >/dev/null 2>&1 || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1587,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ -d \"${TEXISE_CACHE_DIR}/console-science\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1588,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "rm -rf \"${TEXISE_CACHE_DIR}/console-science\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1589,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Removed retired host-side Linux Terminal scientific overlay cache.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1593,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_restart_services() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1594,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_legacy_server_storage"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1595,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl restart texise-latex-compile.service"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1596,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl restart texise-console-gateway.service"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1597,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl restart texise.service"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1601,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_restore_previous_dist() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1602,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ ! -d \"${TEXISE_PREVIOUS_DIST_DIR}\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1603,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'No previous production dist is available for frontend rollback.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1607,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Restoring the previous production dist after failed deployment health checks.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1608,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "rm -rf \"${TEXISE_DIST_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1609,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "mv \"${TEXISE_PREVIOUS_DIST_DIR}\" \"${TEXISE_DIST_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1614,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_api_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1620,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Trusted API health check passed.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1626,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Trusted API failed to become healthy on 127.0.0.1:3100.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1628,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Recent texise.service journal follows:' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1629,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "journalctl -u texise.service -n 80 --no-pager -o cat >&2 || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1633,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_frontend_font_signature_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1635,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local cert=\"/etc/letsencrypt/live/texise.com/fullchain.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1636,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local key=\"/etc/letsencrypt/live/texise.com/privkey.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1639,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "curl \"${curl_args[@]}\" --insecure --resolve www.texise.com:443:127.0.0.1 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1640,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"https://www.texise.com${path}\" | node -e 'let chunks=[];process.stdin.on(\"data\",c=>chunks.push(c)).on(\"end\",()=>{const b=Buffer.concat(chunks);if(b.length<4)process.exit(1);const tag=b.subarray(0,4).toString(\"latin1\");const scalar=b.readUInt32BE(0);if(!(tag===\"wOF2\"||tag===\"OTTO\"||tag===\"true\"||tag===\"typ1\"||scalar===0x00010000))process.exit(1)})'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1642,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "curl \"${curl_args[@]}\" --resolve www.texise.com:80:127.0.0.1 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1643,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"http://www.texise.com${path}\" | node -e 'let chunks=[];process.stdin.on(\"data\",c=>chunks.push(c)).on(\"end\",()=>{const b=Buffer.concat(chunks);if(b.length<4)process.exit(1);const tag=b.subarray(0,4).toString(\"latin1\");const scalar=b.readUInt32BE(0);if(!(tag===\"wOF2\"||tag===\"OTTO\"||tag===\"true\"||tag===\"typ1\"||scalar===0x00010000))process.exit(1)})'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1647,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_frontend_request() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1649,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local cert=\"/etc/letsencrypt/live/texise.com/fullchain.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1650,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local key=\"/etc/letsencrypt/live/texise.com/privkey.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1654,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--resolve www.texise.com:443:127.0.0.1 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1655,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"https://www.texise.com${path}\" >/dev/null"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1658,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--resolve www.texise.com:80:127.0.0.1 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1659,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"http://www.texise.com${path}\" >/dev/null"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1664,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_frontend_failure_diagnostics() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1665,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache virtual-host diagnostics follow:' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1667,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if compgen -G '/etc/apache2/sites-enabled/*texise*' >/dev/null; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1668,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log 'Enabled TeXise Apache site links:' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1669,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "ls -l /etc/apache2/sites-enabled/*texise* >&2 || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1671,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log 'TeXise frontend route diagnostics follow:' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1672,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ -f \"${TEXISE_DIST_DIR}/index.html\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1673,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "ls -l \"${TEXISE_DIST_DIR}/index.html\" >&2 || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1675,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Missing production shell: ${TEXISE_DIST_DIR}/index.html\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1677,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local cert=\"/etc/letsencrypt/live/texise.com/fullchain.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1678,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local key=\"/etc/letsencrypt/live/texise.com/privkey.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1683,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--resolve www.texise.com:443:127.0.0.1 \"https://www.texise.com${probe_path}\" >&2 || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1686,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--resolve www.texise.com:80:127.0.0.1 \"http://www.texise.com${probe_path}\" >&2 || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1692,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_frontend_head_request() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1694,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local cert=\"/etc/letsencrypt/live/texise.com/fullchain.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1695,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local key=\"/etc/letsencrypt/live/texise.com/privkey.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1699,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--resolve www.texise.com:443:127.0.0.1 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1700,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"https://www.texise.com${path}\" >/dev/null"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1703,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--resolve www.texise.com:80:127.0.0.1 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1704,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"http://www.texise.com${path}\" >/dev/null"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1708,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_frontend_static_asset_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1712,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "local user_agent=\"${4:-TeXiseHealth/1.0}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1713,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local cert=\"/etc/letsencrypt/live/texise.com/fullchain.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1714,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local key=\"/etc/letsencrypt/live/texise.com/privkey.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1724,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--resolve www.texise.com:443:127.0.0.1 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1725,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"https://www.texise.com${path}\" || { rm -f -- \"${headers}\" \"${body}\"; return 1; }"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1731,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--resolve www.texise.com:80:127.0.0.1 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1732,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"http://www.texise.com${path}\" || { rm -f -- \"${headers}\" \"${body}\"; return 1; }"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1736,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Static asset ${path} returned an unexpected Content-Type for ${user_agent}.\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1743,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ \"$(od -An -tx1 -N4 \"${body}\" | tr -d ' \\n')\" == '00000100' ]] || { texise_log \"${path} did not return ICO bytes; possible SPA fallback.\" >&2; rm -f -- \"${headers}\" \"${body}\"; return 1; }"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1746,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ \"$(od -An -tx1 -N8 \"${body}\" | tr -d ' \\n')\" == '89504e470d0a1a0a' ]] || { texise_log \"${path} did not return PNG bytes; possible SPA fallback.\" >&2; rm -f -- \"${headers}\" \"${body}\"; return 1; }"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1749,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "node -e 'const fs=require(\"node:fs\");const s=fs.readFileSync(process.argv[1],\"utf8\").slice(0,8192);if(!/<svg(?:\\s|>)/iu.test(s)||/<html(?:\\s|>)/iu.test(s))process.exit(1)' \"${body}\" || { texise_log \"${path} did not return SVG content; possible SPA fallback.\" >&2; rm -f -- \"${headers}\" \"${body}\"; return 1; }"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1752,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "node -e 'const fs=require(\"node:fs\");const s=fs.readFileSync(process.argv[1],\"utf8\");if(/<html(?:\\s|>)/iu.test(s))process.exit(1);const j=JSON.parse(s);if(!j||typeof j!==\"object\")process.exit(1)' \"${body}\" || { texise_log \"${path} did not return a valid web manifest; possible SPA fallback.\" >&2; rm -f -- \"${headers}\" \"${body}\"; return 1; }"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1756,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Unknown static asset signature kind: ${signature_kind}\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1765,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_frontend_redirect_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1768,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local cert=\"/etc/letsencrypt/live/texise.com/fullchain.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1769,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local key=\"/etc/letsencrypt/live/texise.com/privkey.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1772,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "headers=\"$(curl --insecure --silent --show-error --head --resolve www.texise.com:443:127.0.0.1 \"https://www.texise.com${path}\")\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1774,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "headers=\"$(curl --silent --show-error --head --resolve www.texise.com:80:127.0.0.1 \"http://www.texise.com${path}\")\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1780,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Legacy URL ${path} returned HTTP ${status:-missing} Location=${location:-missing}; expected 301 ${expected_location}.\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1785,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_frontend_security_headers_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1786,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local cert=\"/etc/letsencrypt/live/texise.com/fullchain.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1787,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local key=\"/etc/letsencrypt/live/texise.com/privkey.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1791,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--resolve www.texise.com:443:127.0.0.1 https://www.texise.com/)\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1794,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--resolve www.texise.com:80:127.0.0.1 http://www.texise.com/)\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1803,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_frontend_csp_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1804,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_frontend_security_headers_health_check"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1807,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_template_runtime_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1808,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local source_probe=\"${TEXISE_TEMPLATE_ROOT}/.texise-runtime-write-${RANDOM}-$$\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1809,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "local public_probe=\"${TEXISE_TEMPLATE_PUBLIC_COPY}/.texise-runtime-write-${RANDOM}-$$\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1811,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--unit=\"texise-template-probe-$$-${RANDOM}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1812,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--property=User=texise \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1813,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--property=Group=texise \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1816,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "--property=\"ReadWritePaths=${TEXISE_TEMPLATE_ROOT} ${TEXISE_TEMPLATE_PUBLIC_COPY}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1820,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Template Admin runtime write/read probe failed under the service sandbox.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1823,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ ! -e \"${TEXISE_TEMPLATE_PUBLIC_COPY}/free\" && ! -e \"${TEXISE_TEMPLATE_PUBLIC_COPY}/pro\" ]] || {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1824,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Live template catalog unexpectedly contains raw free/pro source trees.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1827,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Persistent template Admin write boundary and safe live catalog health check passed.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1830,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_blog_media_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1831,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local cert=\"/etc/letsencrypt/live/texise.com/fullchain.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1832,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local key=\"/etc/letsencrypt/live/texise.com/privkey.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1841,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "stage_dir=\"${TEXISE_BLOG_MEDIA_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1843,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "stage_dir=\"${TEXISE_DOCS_MEDIA_DIR}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1845,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "probe_name=\".texise-health-${kind}-${RANDOM}-$$.png\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1847,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "published_probe_file=\"${TEXISE_MEDIA_PUBLISHED_ROOT}/${kind}/${probe_name}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1848,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "public_path=\"/texise-media/${kind}/${probe_name}\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1851,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--unit=\"texise-media-probe-$$-${RANDOM}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1852,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--property=User=texise \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1853,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--property=Group=texise \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1857,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "--property=\"ReadWritePaths=${stage_dir} ${TEXISE_MEDIA_PUBLISHED_ROOT}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1861,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"${kind} media staging/live-projection write/read probe failed.\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1866,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "signature=\"$(curl --fail --insecure --silent --show-error --range 0-7 --resolve www.texise.com:443:127.0.0.1 \"https://www.texise.com${public_path}\" | od -An -tx1 | tr -d ' \\n')\" || { rm -f -- \"${probe_file}\" \"${published_probe_file}\"; return 1; }"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1868,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "signature=\"$(curl --fail --silent --show-error --range 0-7 --resolve www.texise.com:80:127.0.0.1 \"http://www.texise.com${public_path}\" | od -An -tx1 | tr -d ' \\n')\" || { rm -f -- \"${probe_file}\" \"${published_probe_file}\"; return 1; }"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1872,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"${kind} media URL returned unexpected bytes or SPA fallback.\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1879,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "protected_status=\"$(curl --insecure --silent --output /dev/null --write-out '%{http_code}' --resolve www.texise.com:443:127.0.0.1 https://www.texise.com/texise-data/runtime/probe)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1881,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "protected_status=\"$(curl --silent --output /dev/null --write-out '%{http_code}' --resolve www.texise.com:80:127.0.0.1 http://www.texise.com/texise-data/runtime/probe)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1884,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Protected /texise-data path returned HTTP ${protected_status}, expected 403.\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1887,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Blog/Docs media staging, live projection, static serving and texise-data denial checks passed.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1891,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_collaboration_live_health_check() ("
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1896,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ -r \"${TEXISE_CONFIG_DIR}/texise.env\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1899,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "source \"${TEXISE_CONFIG_DIR}/texise.env\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1902,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/check-collaboration-live.mjs\" \"$@\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1905,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_frontend_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1908,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1909,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache frontend health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1910,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_frontend_failure_diagnostics"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1913,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/about'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1914,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache server-rendered public route health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1919,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request \"${canonical_route}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1920,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Apache canonical route refresh health check failed: ${canonical_route}\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1925,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local cert=\"/etc/letsencrypt/live/texise.com/fullchain.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1926,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "local key=\"/etc/letsencrypt/live/texise.com/privkey.pem\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1928,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "examples_headers=\"$(curl --insecure --silent --show-error --head --resolve www.texise.com:443:127.0.0.1 https://www.texise.com/examples)\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1930,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "examples_headers=\"$(curl --silent --show-error --head --resolve www.texise.com:80:127.0.0.1 http://www.texise.com/examples)\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1933,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache /examples compatibility redirect did not target /templates.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1936,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/texise-templates/templates.json'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1937,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache template manifest health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1940,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/texise-templates/categories.json'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1941,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache template category registry health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1944,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/texise-icons/lucide-category-icons.json' ||"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1945,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "! texise_frontend_request '/texise-icons/lucide-category-icons.svg' ||"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1946,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "! texise_frontend_request '/texise-icons/lucide/file-text.svg'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1947,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache static Lucide category icon assets health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1950,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/texise-icons/app-icon-192.png'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1951,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache PWA icon health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1955,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "for favicon_ua in 'TeXiseHealth/1.0' 'Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)'; do"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1956,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_static_asset_health_check '/favicon.ico' 'image/(x-icon|vnd\\.microsoft\\.icon)' ico \"${favicon_ua}\" ||"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1957,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "! texise_frontend_static_asset_health_check '/favicon-96x96.png' 'image/png' png \"${favicon_ua}\" ||"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1958,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "! texise_frontend_static_asset_health_check '/favicon.svg' 'image/svg\\+xml' svg \"${favicon_ua}\" ||"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1959,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "! texise_frontend_static_asset_health_check '/apple-touch-icon.png' 'image/png' png \"${favicon_ua}\" ||"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1960,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "! texise_frontend_static_asset_health_check '/site.webmanifest' 'application/(manifest\\+json|json)' manifest \"${favicon_ua}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1961,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Apache favicon/manifest crawler health check failed for ${favicon_ua}.\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1965,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if ! texise_frontend_redirect_health_check '/latex-templates' 'https://www.texise.com/templates' ||"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1966,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "! texise_frontend_redirect_health_check '/latex-templates/modern-thesis' 'https://www.texise.com/templates/modern-thesis'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1967,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Legacy /latex-templates canonical consolidation health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1972,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/texise-fonts/Inter-Variable.woff2 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1973,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/texise-fonts/JetBrainsMono-Variable.woff2 \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1974,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/texise-fonts/Moranga-Light.otf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1975,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/texise-fonts/Moranga-Regular.otf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1976,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/texise-fonts/Moranga-RegularItalic.otf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1977,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/texise-fonts/Moranga-Bold.otf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1978,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/texise-fonts/STIXTwoText-VariableFont.ttf \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1979,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "/texise-fonts/STIXTwoText-Italic-Variable.ttf; do"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1980,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_font_signature_check \"${browser_font}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1981,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Apache browser-font health check failed or returned a non-font fallback: ${browser_font}\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1985,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/compiler/status.json'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1986,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache compiler status health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1989,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if [[ \"$(texise_compiler_profile)\" == \"full\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 1999,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_head_request \"${busytex_url}\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2000,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Apache full compiler asset health check failed: ${busytex_url}\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2004,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ \"${TEXISE_DEPLOY_CERTIFY}\" == \"1\" ]] && ! texise_frontend_request '/release/certification.json'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2005,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache runtime certification health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2009,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/texlive/texlive-lsr.txt'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2010,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache TeX Live ls-R health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2014,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/texlive/cache-manifest-text.txt'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2015,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache TeX Live manifest health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2018,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/texlive/cache/amsmath.sty'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2019,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache bundled TeX Live package health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2022,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/texlive/cache/cm-super-ts1.enc'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2023,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache CM-Super TS1 encoding health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2026,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_request '/texlive/cache/cm-super-ts1.map'; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2027,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache CM-Super TS1 map health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2030,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if [[ -r /etc/letsencrypt/live/texise.com/fullchain.pem && -r /etc/letsencrypt/live/texise.com/privkey.pem ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2031,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if ! node \"${TEXISE_SOURCE_ROOT}/scripts/check-collaboration-signaling.mjs\" 'wss://127.0.0.1/collab-signal' www.texise.com; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2032,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Collaboration signaling compatibility proxy health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2035,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if ! texise_collaboration_live_health_check 'wss://127.0.0.1/collab-live' www.texise.com; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2036,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Collaboration live document relay health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2040,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if ! node \"${TEXISE_SOURCE_ROOT}/scripts/check-collaboration-signaling.mjs\" 'ws://127.0.0.1:3101/collab-signal' www.texise.com; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2041,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Collaboration signaling compatibility proxy health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2044,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if ! texise_collaboration_live_health_check 'ws://127.0.0.1:3101/collab-live' www.texise.com; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2045,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Collaboration live document relay health check failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2049,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_frontend_security_headers_health_check; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2050,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Apache browser security-header health check failed (CSP/COOP/COEP).' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2053,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log 'Apache frontend, canonical SPA routes, legacy template redirects, favicon/manifest crawler responses, template manifest, browser fonts, PWA icon, compiler status, TeX Live, collaboration signaling/live relay, and browser security-header health checks passed.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2057,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_release_pair_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2060,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if [[ -r /etc/letsencrypt/live/texise.com/fullchain.pem && -r /etc/letsencrypt/live/texise.com/privkey.pem ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2061,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "frontend_release=\"$(curl --fail --insecure --silent --resolve www.texise.com:443:127.0.0.1 https://www.texise.com/release.json | node -e 'let s=\"\";process.stdin.on(\"data\",c=>s+=c).on(\"end\",()=>process.stdout.write(JSON.parse(s).releaseId||\"\"))')\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2063,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "frontend_release=\"$(curl --fail --silent --resolve www.texise.com:80:127.0.0.1 http://www.texise.com/release.json | node -e 'let s=\"\";process.stdin.on(\"data\",c=>s+=c).on(\"end\",()=>process.stdout.write(JSON.parse(s).releaseId||\"\"))')\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2066,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Release pair mismatch: API=${api_release:-missing} frontend=${frontend_release:-missing}\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2069,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ \"${TEXISE_DEPLOY_CERTIFY}\" == \"1\" ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2071,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if [[ -r /etc/letsencrypt/live/texise.com/fullchain.pem && -r /etc/letsencrypt/live/texise.com/privkey.pem ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2072,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "certification_release=\"$(curl --fail --insecure --silent --resolve www.texise.com:443:127.0.0.1 https://www.texise.com/release/certification.json | node -e 'let s=\"\";process.stdin.on(\"data\",c=>s+=c).on(\"end\",()=>{const c=JSON.parse(s);if(c.status!==\"passed\"||c.certificationLevel!==\"production-browser\")process.exit(2);process.stdout.write(c.releaseId||\"\")})')\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2074,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "certification_release=\"$(curl --fail --silent --resolve www.texise.com:80:127.0.0.1 http://www.texise.com/release/certification.json | node -e 'let s=\"\";process.stdin.on(\"data\",c=>s+=c).on(\"end\",()=>{const c=JSON.parse(s);if(c.status!==\"passed\"||c.certificationLevel!==\"production-browser\")process.exit(2);process.stdout.write(c.releaseId||\"\")})')\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2077,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Certification release mismatch: certification=${certification_release:-missing} frontend=${frontend_release}\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2080,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Coherent frontend/API/certification release pair verified: ${api_release}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2082,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Coherent frontend/API release pair verified: ${api_release}.\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2086,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_cloud_compile_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2088,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "worker_url=\"$(texise_env_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_CLOUD_COMPILE_WORKER_URL)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2089,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "worker_secret=\"$(texise_env_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_CLOUD_COMPILE_WORKER_SECRET)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2090,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cloud_image=\"$(texise_env_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_CLOUD_COMPILE_IMAGE)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2092,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Cloud Compile worker URL is not loopback-only: ${worker_url}\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2106,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Cloud Compile worker health endpoint failed after startup retries: ${root_url}\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2108,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "journalctl -u texise-latex-compile.service -n 80 --no-pager -o cat >&2 || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2111,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "printf '%s' \"${response}\" | node -e 'let s=\"\";const expected=process.argv[1];process.stdin.on(\"data\",c=>s+=c).on(\"end\",()=>{const x=JSON.parse(s);if(x.status!==\"ok\"||x.service!==\"texise-latex-compile-service\"||x.dockerImage!==expected||!Array.isArray(x.engines)||!x.limits)process.exit(2)})' \"${cloud_image}\" || { texise_log \"Cloud Compile health image mismatch; expected ${cloud_image}.\" >&2; return 1; }"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2113,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Cloud Compile worker secret is unexpectedly empty.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2116,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ \"$(texise_env_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_CLOUD_COMPILE_ENABLED)\" == '1' || \"$(texise_env_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_CLOUD_COMPILE_FREE_FALLBACK)\" == '1' ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2118,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "allowed_engines=\"$(texise_env_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_CLOUD_COMPILE_ALLOWED_ENGINES)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2119,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_WORKER_URL=\"${worker_url}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2120,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_WORKER_SECRET=\"${worker_secret}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2121,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CLOUD_COMPILE_ALLOWED_ENGINES=\"${allowed_engines}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2122,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/check-cloud-compile-worker.mjs\" || {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Cloud Compile production compile certification failed.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2127,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Private Cloud Compile worker health check passed.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2130,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_console_gateway_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2132,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "gateway_url=\"$(texise_env_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_CONSOLE_GATEWAY_URL)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2133,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "gateway_secret=\"$(texise_env_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_CONSOLE_GATEWAY_SECRET)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2134,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "console_image=\"$(texise_env_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_CONSOLE_IMAGE)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2136,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Console Gateway URL is not loopback-only: ${gateway_url}\" >&2; return 1;"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2138,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[[ -n \"${gateway_secret}\" ]] || { texise_log 'Console Gateway secret is unexpectedly empty.' >&2; return 1; }"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2149,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Console Gateway health endpoint failed after startup retries.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2151,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "journalctl -u texise-console-gateway.service -n 80 --no-pager -o cat >&2 || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2154,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "printf '%s' \"${response}\" | node -e 'let s=\"\";process.stdin.on(\"data\",c=>s+=c).on(\"end\",()=>{const x=JSON.parse(s);if(x.ok!==true||x.service!==\"texise-console-gateway\")process.exit(2)})' || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2155,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if [[ \"$(texise_env_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_LINUX_TERMINAL_ENABLED)\" == '1' ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2156,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONSOLE_GATEWAY_URL=\"${gateway_url}\" TEXISE_CONSOLE_GATEWAY_SECRET=\"${gateway_secret}\" TEXISE_CONSOLE_IMAGE=\"${console_image}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2157,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/check-console-gateway.mjs\" || {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2158,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'TexLab production certification failed.' >&2; return 1;"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2161,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'TexLab Console Gateway health check passed.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2164,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_legacy_origin_redirect_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2166,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "status=\"$(curl --silent --output /dev/null --write-out '%{http_code}' --resolve app.texise.com:80:127.0.0.1 'http://app.texise.com/ws?legacy=1')\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2167,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "location=\"$(curl --silent --show-error --head --resolve app.texise.com:80:127.0.0.1 'http://app.texise.com/ws?legacy=1' | tr -d '\\r' | grep -i '^Location:' | tail -n1 | cut -d' ' -f2-)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2168,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ \"${status}\" == '301' && \"${location}\" == 'https://www.texise.com/ws?legacy=1' ]] || {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2169,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Legacy HTTP redirect mismatch: status=${status} location=${location}\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2172,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if app_pair=\"$(texise_find_certificate_for_host app.texise.com)\"; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2175,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "location=\"$(curl --insecure --silent --show-error --head --resolve app.texise.com:443:127.0.0.1 'https://app.texise.com/ws?legacy=1' | tr -d '\\r' | grep -i '^Location:' | tail -n1 | cut -d' ' -f2-)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2176,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ \"${location}\" == 'https://www.texise.com/ws?legacy=1' ]] || {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2177,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log \"Legacy HTTPS redirect mismatch: ${location}\" >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2184,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log 'Legacy app.texise.com compatibility redirect checks passed.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2187,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_indexnow_key_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2189,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "key=\"$(texise_env_scalar_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_INDEXNOW_KEY)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2191,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'IndexNow ownership key is missing or invalid during deployment health check.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2194,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if [[ -r /etc/letsencrypt/live/texise.com/fullchain.pem && -r /etc/letsencrypt/live/texise.com/privkey.pem ]]; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2195,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "actual=\"$(curl --fail --insecure --silent --show-error --resolve www.texise.com:443:127.0.0.1 \"https://www.texise.com/${key}.txt\")\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2197,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "actual=\"$(curl --fail --silent --show-error --resolve www.texise.com:80:127.0.0.1 \"http://www.texise.com/${key}.txt\")\" || return 1"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2201,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Published IndexNow ownership file did not return the configured key.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2204,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'IndexNow ownership-file health check passed.'"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2207,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_indexnow_notify() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2209,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "key=\"$(texise_env_scalar_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_INDEXNOW_KEY)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2210,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "public_url=\"$(texise_env_scalar_value \"${TEXISE_CONFIG_DIR}/texise.env\" TEXISE_PUBLIC_URL)\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2212,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_INDEXNOW_KEY=\"${key}\" TEXISE_PUBLIC_URL=\"${public_url:-https://www.texise.com}\" \\"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2213,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "node \"${TEXISE_SOURCE_ROOT}/scripts/submit-indexnow.mjs\""
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2216,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_health_check() {"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2217,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if texise_api_health_check && texise_cloud_compile_health_check && texise_console_gateway_health_check && texise_frontend_health_check && texise_template_runtime_health_check && texise_blog_media_health_check && texise_legacy_origin_redirect_health_check && texise_release_pair_health_check && texise_indexnow_key_health_check; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2218,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_retire_legacy_services"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2219,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_cleanup_legacy_server_storage"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2220,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ! texise_indexnow_notify; then"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2221,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'IndexNow notification failed after a healthy deployment; continuing without rollback.' >&2"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2226,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl --no-pager --full status texise.service || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2227,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_restore_previous_dist || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2228,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_restore_previous_runtime || true"
    },
    {
      "path": "scripts/lib/texise-deploy.sh",
      "line": 2229,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_die 'Deployment health check failed. The previous static dist was restored when available; inspect texise.service before retrying.'"
    },
    {
      "path": "scripts/patch-busytex-runtime.mjs",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'[TeXise] BusyTeX legacy no-Biber pipeline shimmed safely: isolated-worker compilation enabled; Biber disabled.',"
    },
    {
      "path": "scripts/patch-busytex-runtime.mjs",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] BusyTeX runtime ABI verified: ${result.abi} (${result.mode}).`);"
    },
    {
      "path": "scripts/prepare-busytex-runtime-for-build.mjs",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const profile = (process.env.TEXISE_COMPILER_PROFILE || 'full').trim().toLowerCase();"
    },
    {
      "path": "scripts/prepare-busytex-runtime-for-build.mjs",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "throw new Error(`Unknown TEXISE_COMPILER_PROFILE=${profile}; expected full or pdflatex`);"
    },
    {
      "path": "scripts/prepare-busytex-runtime-for-build.mjs",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "process.env.TEXISE_BUSY_COMPILER_DIR ||"
    },
    {
      "path": "scripts/prepare-production-dist.mjs",
      "line": 11,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const mediaStageRoot = process.env.LEARNITIVE_MEDIA_STAGE_ROOT || process.env.TEXISE_MEDIA_STAGE_ROOT || path.join(path.dirname(root), 'learnitive-media');"
    },
    {
      "path": "scripts/prepare-production-dist.mjs",
      "line": 57,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const serviceWorkerRelease = /texise-app-shell-r\\d+-\\d+-\\d+-(buildfix\\d+(?:-\\d+)?)-v1/u.exec(serviceWorker)?.[1];"
    },
    {
      "path": "scripts/pricing-access-regression.test.mjs",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(ai, /API_KEY_KEY = 'texise:ai:remembered-api-key:v1'/u);"
    },
    {
      "path": "scripts/pricing-access-regression.test.mjs",
      "line": 61,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(config, /TEXISE_FREE_PLAN_LIMIT/u);"
    },
    {
      "path": "scripts/pricing-access-regression.test.mjs",
      "line": 96,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'PDF export — TeXise watermark',"
    },
    {
      "path": "scripts/pricing-access-regression.test.mjs",
      "line": 106,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(marketing.slice(marketing.indexOf('TEXISE_PRICING_PLANS'), marketing.indexOf('TEXISE_PLAN_COMPARISON')), /Everything in Free|Local \\+ Cloud Compile|Docker Full TeX Live fallback/u);"
    },
    {
      "path": "scripts/project-execution-service.node.test.mjs",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(service, /x-texise-csrf/);"
    },
    {
      "path": "scripts/r12-runtime-dependency-install.node.test.mjs",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(unit, /public_html\\/texise-services\\/console-gateway/u);"
    },
    {
      "path": "scripts/r12-runtime-dependency-install.node.test.mjs",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(source, /\\[TeXise\\]/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'Start writing with TeXise.',"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('R14.28.14 Home keeps the TeXise reference story and dual compile model', async () => {"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(hero, /TeXise — Privacy First Research/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /texise-docs-code-copy/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 69,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 71,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "assert.match(entry, /installTeXiseLocationChangeBridge\\(window\\);[\\s\\S]*?consumePwaLaunchParams\\(window\\);[\\s\\S]*?const bootLocation = \\{[\\s\\S]*?pathname: window\\.location\\.pathname,[\\s\\S]*?search: window\\.location\\.search,[\\s\\S]*?hash: window\\.location\\.hash/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 74,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "assert.match(entry, /<TeXiseRootApplication[\\s\\S]*?initialSurface=/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 76,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(entry, /window\\.addEventListener\\(TEXISE_LOCATION_CHANGE_EVENT, synchronize\\)/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 78,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(entry, /texise-texlive-sw\\.js\\?build=\\$\\{encodeURIComponent\\(APP_BUILD_TIME\\)\\}/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 79,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(bootSurface, /TEXISE_LOCATION_CHANGE_EVENT = 'texise:locationchange'/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 84,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(serviceWorker, /texise-app-shell-r14-28-(?:15-buildfix34|16-buildfix35|17-buildfix36|18-buildfix37|19-buildfix38|20-buildfix40|20-buildfix41|20-buildfix42|20-buildfix43|20-buildfix44|20-buildfix45|20-buildfix46|20-buildfix47|20-buildfix48|20-buildfix49)-v1/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 89,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(install, /Installing TeXise R14\\.28\\.(?:15 Build Fix 34|16 Build Fix 35|17 Build Fix 36|18 Build Fix 37|19 Build Fix 38|20 Build Fix 40|20 Build Fix 41|20 Build Fix 42|20 Build Fix 43|20 Build Fix 44|20 Build Fix 45|20 Build Fix 46|20 Build Fix 47|20 Build Fix 48|20 Build Fix 49)/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 95,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/apache/texise.com-http.conf'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 96,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 97,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/apache/app.texise.com-redirect-https.conf'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 98,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 100,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(http, /ServerName www\\.texise\\.com/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 101,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(http.includes('RewriteRule ^/?examples/?$ https://www.texise.com/templates [R=301,L,NE]'), 'HTTP Apache must preserve /examples -> /templates before the canonical HTTPS catch-all');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 102,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(https, /ServerName www\\.texise\\.com/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 106,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(https.includes('RewriteRule ^/?examples/?$ https://www.texise.com/templates [R=301,L,NE]'), 'Apache must issue a real /examples -> /templates redirect before SPA fallback');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 111,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(appRedirect, /ServerName app\\.texise\\.com/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 112,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(appRedirect, /https:\\/\\/www\\.texise\\.com/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 113,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /texise_retire_legacy_services/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 114,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /systemctl enable texise-console-gateway\\.service/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 115,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /texise\\.com-le-ssl\\.conf/u, 'installer must disable the legacy primary Certbot vhost that can shadow www.texise.com and serve the source root');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 116,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_frontend_failure_diagnostics/u, 'frontend health failures must print Apache vhost selection diagnostics');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 117,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "for (const unit of ['texise-collab.service','texise-reverb.service']) assert.ok(deploy.includes(unit));"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 118,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(deploy, /texise-console-gateway\\.service texise-collab\\.service texise-reverb\\.service/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 127,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 128,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 142,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('texise-services/console-gateway/server.js'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 145,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 146,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 147,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/config/texise.env.example'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 156,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(editor, /Sec-WebSocket-Protocol|texise-auth\\./u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 160,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(envExample, /TEXISE_CLOUD_COMPILE_IMAGE=texlive\\/texlive:latest/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 161,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(envExample, /TEXISE_CONSOLE_IMAGE=texlive\\/texlive-console:pro/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 162,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(envExample, /TEXISE_EXECUTION_IMAGE=/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 163,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_console_gateway_health_check/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 164,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_CLOUD_COMPILE_IMAGE 'texlive\\/texlive:latest'/u, 'installer must seed the dedicated Cloud Compile image');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 165,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_CONSOLE_IMAGE 'texlive\\/texlive-console:pro'/u, 'installer must seed the dedicated Linux Terminal image');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 166,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /COMPILE_DOCKER_IMAGE 'texise\\/console-texlive-full:latest' 'texlive\\/texlive:latest'/u, 'installer must migrate the retired shared Cloud image default');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 167,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /sed -i '\\/\\^TEXISE_EXECUTION_IMAGE=\\/d'/u, 'installer must retire the legacy shared image key');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 168,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_ensure_docker_image/u, 'installer must preflight external/base Docker images before service activation');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 169,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_ensure_console_image/u, 'installer must own lifecycle of the canonical TeXise-local console image');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 171,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /com\\.texise\\.image\\.schema/u, 'installer must version-check the locally built Console image before reuse');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 174,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(consoleDockerfile, /\\/etc\\/profile\\.d\\/texise-venv\\.sh/u, 'Console image must preserve its scientific virtualenv through login-shell PATH initialization');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 175,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(consoleDockerfile, /com\\.texise\\.image\\.schema=\"r14\\.28\\.14-bf12\"/u, 'Console image schema must force rebuild after the login-shell PATH fix');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 176,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(gateway, /if \\[\\[ -x \\/opt\\/texise-venv\\/bin\\/python3 \\]\\]; then export VIRTUAL_ENV=\\/opt\\/texise-venv; export PATH=/u, 'Gateway must re-prepend the scientific virtualenv after bash -lc resets PATH');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 180,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(deploy, /texise_provision_console_scientific_stack/u, 'dedicated console image must not trigger host-side scientific provisioning');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 181,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /usermod -a -G docker texise-console/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 182,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /usermod -a -G docker texise-compile/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 183,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /install -d -o root -g texise -m 0751 \"\\$\\{TEXISE_DATA_DIR\\}\"/u, 'execution services need execute-only traversal through texise-data');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 184,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /install -d -o texise -g texise -m 0711 \"\\$\\{TEXISE_TMP_DIR\\}\"/u, 'execution services need execute-only traversal through texise-data/tmp');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 185,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_verify_execution_workspace_access texise-compile texise-compile/u, 'Cloud Compile workspace permissions must be verified as the service account');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 186,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_verify_execution_workspace_access texise-console texise-console/u, 'Console workspace permissions must be verified as the service account');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 187,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_quiesce_service_for_dependency_install texise-latex-compile\\.service/u, 'Cloud Compile must be quiesced while npm ci replaces node_modules');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 188,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_quiesce_service_for_dependency_install texise-console-gateway\\.service/u, 'Console Gateway must be quiesced while npm ci replaces node_modules');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 189,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /texise_harden_service_node_modules \"\\$\\{TEXISE_CLOUD_COMPILE_DIR\\}\" express/u, 'Cloud Compile dependency installation must verify express');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 190,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /texise_harden_service_node_modules \"\\$\\{TEXISE_CONSOLE_DIR\\}\" node-pty/u, 'Console Gateway dependency installation must verify node-pty');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 193,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(deploy, /find \"\\$\\{TEXISE_CONSOLE_DIR\\}\" -type f -exec chmod 0644/u, 'Console deployment must preserve node-pty executable bits');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 203,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(consoleCheck, /path\\.resolve\\('texise-services\\/console-gateway\\/node_modules/u, 'Console certification must not depend on the caller current working directory');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 205,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(certificationCommand, /__TEXISE_CONSOLE_CERT_OK__/u, 'Console certification success marker must not appear literally in PTY input because interactive terminals echo commands before execution');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 206,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(certificationCommand, /printf '%s%s\\\\\\\\n' '__TEXISE_CONSOLE_CERT_' 'OK__'/u, 'Console certification must construct the success marker only during command execution');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 215,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('R14.28.14 BF17 vendored TikZ Draw is a large local TeXise editor with canonical insertion', async () => {"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 242,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /--texise-yellow:#DA0B4E/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 243,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /--texise-tool-bg:#ffffff/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 244,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /--texise-tool-active:#DA0B4E/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 245,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /\\.tool \\{[\\s\\S]*?background:var\\(--texise-tool-bg\\)!important[\\s\\S]*?color:var\\(--texise-tool-fg\\)!important/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 246,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /\\.tool\\.active \\{[\\s\\S]*?background:var\\(--texise-tool-active\\)!important[\\s\\S]*?color:var\\(--texise-tool-fg\\)!important/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 247,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /\\.btn-primary \\{ background:var\\(--texise-yellow\\)!important;[\\s\\S]*?color:#111111!important/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 248,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /texiseExportPayload/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 249,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /source:\\s*'texise-tikz-draw'[\\s\\S]*?type:\\s*'insert'/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 260,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 266,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /--texise-tool-bg:#ffffff/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 267,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /--texise-tool-active:#DA0B4E/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 268,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /--texise-tool-fg:#111111/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 269,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /\\.tool\\.active \\{[\\s\\S]*?background:var\\(--texise-tool-active\\)!important/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 270,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(vendor, /\\.tool \\{[\\s\\S]*?background:var\\(--texise-tool-bg\\)!important/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 272,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(serviceWorker, /texise-app-shell-r14-28-(?:15-buildfix34|16-buildfix35|17-buildfix36|18-buildfix37|19-buildfix38|20-buildfix40|20-buildfix41|20-buildfix42|20-buildfix43|20-buildfix44|20-buildfix45|20-buildfix46|20-buildfix47|20-buildfix48|20-buildfix49)-v1/u, 'current release must rotate the cached collaboration/TikZ UI shell');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 311,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 315,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 316,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 343,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 374,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(page, />(?:Cloud Terminal|TexLab|TeXise Terminal|Terminal)<\\/span>/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 389,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(learn, /texise:learn:completed:v1/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 394,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(learn, /className=\"texise-learn-progress\" aria-label=/u, 'Learn progress must not attach aria-label directly to a generic div');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 398,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /texise-learn-grid/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 406,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('texise-services/console-gateway/package.json'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 407,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('texise-services/console-gateway/package-lock.json'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 417,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const source = await read('texise-services/cloud-compile/server.js');"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 424,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(source, /TEXISE_EXECUTION_IMAGE/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 429,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(source, /\\/var\\/lib\\/texise/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 447,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "if (source.includes('https://app.texise.com')) offenders.push(path.relative(root, file));"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 466,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 481,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 484,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 490,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(provider, /texise-collaboration-v\\$\\{COLLABORATION_PROTOCOL_VERSION\\}:\\$\\{roomId\\}:\\$\\{secret\\}/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 492,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(library, /const PERSISTENCE_NAMESPACE = 'texise-collaboration-v7'/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 536,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(serviceWorker, /texise-app-shell-r14-28-(?:15-buildfix34|16-buildfix35|17-buildfix36|18-buildfix37|19-buildfix38|20-buildfix40|20-buildfix41|20-buildfix42|20-buildfix43|20-buildfix44|20-buildfix45|20-buildfix46|20-buildfix47|20-buildfix48|20-buildfix49)-v1/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 539,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(install, /Installing TeXise R14\\.28\\.(?:15 Build Fix 34|16 Build Fix 35|17 Build Fix 36|18 Build Fix 37|19 Build Fix 38|20 Build Fix 40|20 Build Fix 41|20 Build Fix 42|20 Build Fix 43|20 Build Fix 44|20 Build Fix 45|20 Build Fix 46|20 Build Fix 47|20 Build Fix 48|20 Build Fix 49)/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 553,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /className=\"texise-project-join-progress\" role=\"progressbar\"/u);"
    },
    {
      "path": "scripts/r14-28-14-regression.test.mjs",
      "line": 558,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(app, /className=\"texise-project-join-progress\" aria-label=/u);"
    },
    {
      "path": "scripts/r14-28-15-regression.test.mjs",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/r14-28-15-regression.test.mjs",
      "line": 26,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/r14-28-15-regression.test.mjs",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(sw, /texise-app-shell-r14-28-(?:15-buildfix34|16-buildfix35|17-buildfix36|18-buildfix37|19-buildfix38|20-buildfix40|20-buildfix41|20-buildfix42|20-buildfix43|20-buildfix44|20-buildfix45|20-buildfix46|20-buildfix47|20-buildfix48|20-buildfix49|20-buildfix50)-v1/u);"
    },
    {
      "path": "scripts/r14-28-15-regression.test.mjs",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(install, /Installing TeXise R14\\.28\\.(?:15 Build Fix 34|16 Build Fix 35|17 Build Fix 36|18 Build Fix 37|19 Build Fix 38|20 Build Fix 40|20 Build Fix 41|20 Build Fix 42|20 Build Fix 43|20 Build Fix 44|20 Build Fix 45|20 Build Fix 46|20 Build Fix 47|20 Build Fix 48|20 Build Fix 49|20 Build Fix 50)/u);"
    },
    {
      "path": "scripts/r14-28-15-regression.test.mjs",
      "line": 169,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /texise-projects-page--empty/u);"
    },
    {
      "path": "scripts/r14-28-15-regression.test.mjs",
      "line": 170,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /texise-projects-empty-state/u);"
    },
    {
      "path": "scripts/r14-28-15-regression.test.mjs",
      "line": 173,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-projects-page--empty \\{ min-height: clamp\\(/u);"
    },
    {
      "path": "scripts/r14-28-15-regression.test.mjs",
      "line": 174,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-projects-empty-state/u);"
    },
    {
      "path": "scripts/r14-28-15-regression.test.mjs",
      "line": 175,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-projects-empty-state \\.texise-projects-empty-copy/u);"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "provider: 'packages/js-lib/project-collaboration/src/texise-websocket-provider.ts',"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 35,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(sw, /texise-app-shell-r14-28-(?:16-buildfix35|17-buildfix36|18-buildfix37|19-buildfix38|20-buildfix40|20-buildfix41|20-buildfix42|20-buildfix43|20-buildfix44|20-buildfix45|20-buildfix46|20-buildfix47|20-buildfix48|20-buildfix49|20-buildfix50)-v1/u);"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(install, /Installing TeXise R14\\.28\\.(?:16 Build Fix 35|17 Build Fix 36|18 Build Fix 37|19 Build Fix 38|20 Build Fix 40|20 Build Fix 41|20 Build Fix 42|20 Build Fix 43|20 Build Fix 44|20 Build Fix 45|20 Build Fix 46|20 Build Fix 47|20 Build Fix 48|20 Build Fix 49|20 Build Fix 50)/u);"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 89,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(caps, /texiseReviewChangeIds/u);"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 90,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(caps, /texiseReviewUndoSnapshot/u);"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 103,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(caps, /texiseReviewMutation/u);"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 134,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(features, /cm-texise-review-conflicted/u);"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 135,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(features, /'\\.cm-texise-review-conflicted'/u);"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 158,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts'),"
    },
    {
      "path": "scripts/r14-28-16-regression.test.mjs",
      "line": 163,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(dormant, /LatexVisualCollaborationDecoration|LatexVisualCollaborationAuthorshipDecoration|updateCollaborationDecorations|updateCollaborationAuthorshipDecorations|visual-collaborator-cursor|visual-collaborator-authorship|cm-texise-collaboration-authorship/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 22,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(sw, /texise-app-shell-r14-28-(?:17-buildfix36|18-buildfix37|19-buildfix38|20-buildfix40|20-buildfix41|20-buildfix42|20-buildfix43|20-buildfix44|20-buildfix45|20-buildfix46|20-buildfix47|20-buildfix48|20-buildfix49|20-buildfix50)-v1/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(install, /Installing TeXise R14\\.28\\.(?:17 Build Fix 36|18 Build Fix 37|19 Build Fix 38|20 Build Fix 40|20 Build Fix 41|20 Build Fix 42|20 Build Fix 43|20 Build Fix 44|20 Build Fix 45|20 Build Fix 46|20 Build Fix 47|20 Build Fix 48|20 Build Fix 49|20 Build Fix 50)/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 47,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(dialog, /signed-in TeXise Pro account/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 56,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(account, /texise-account-popover/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(wsCss, /texise-editor-account-popover/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /srcSet=\"\\/texise-logo-mobile\\.png\"/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 75,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /src=\"\\/texise-logo\\.png\"/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /className=\"texise-brand-logo\"/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 77,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(app, /texise-brand-mark|texise-brand-word/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 78,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(css, /\\.texise-brand-mark|\\.texise-brand-word/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 87,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(settings, /texise-account-metadata/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 94,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-account-metadata[^}]*font-size: \\.78rem/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 103,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(settings, /texise-settings-entitlement-stack/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 105,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "assert.match(card, /texise-license-link-card/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 109,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "assert.match(app, /We couldn't verify this TeXise Pro license key/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 112,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "assert.match(css, /\\.texise-license-link-card/u);"
    },
    {
      "path": "scripts/r14-28-17-regression.test.mjs",
      "line": 113,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "assert.match(css, /\\.texise-license-success/u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('package.json'), read('packages/tooling/browser-entry/public/texise-texlive-sw.js'), read('scripts/install.sh'),"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'), read('packages/core/service-core/src/project-collaboration-service.ts'),"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(sw, /texise-app-shell-r14-28-(?:18-buildfix37|19-buildfix38|20-buildfix40|20-buildfix41|20-buildfix42|20-buildfix43|20-buildfix44|20-buildfix45|20-buildfix46|20-buildfix47|20-buildfix48|20-buildfix49|20-buildfix50)-v1/u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(install, /Installing TeXise R14\\.28\\.(?:18 Build Fix 37|19 Build Fix 38|20 Build Fix 40|20 Build Fix 41|20 Build Fix 42|20 Build Fix 43|20 Build Fix 44|20 Build Fix 45|20 Build Fix 46|20 Build Fix 47|20 Build Fix 48|20 Build Fix 49|20 Build Fix 50)/u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 65,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /src=\"\\/texise-logo\\.png\"/u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 66,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /srcSet=\"\\/texise-logo-mobile\\.png\"/u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/src/texise-design.css'), read('packages/tooling/browser-entry/src/index.css'),"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(index, /h1\\.texise-visual-heading \\{ font-size: 1\\.9rem; \\}/u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 75,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(index, /h2\\.texise-visual-heading \\{ font-size: 1\\.65rem; \\}/u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(index, /h3\\.texise-visual-heading \\{ font-size: 1\\.38rem; \\}/u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 86,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(editor, /TeXise Terminal|>TexLab</u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 90,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(texLab, /signed-in TeXise Pro account/u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 149,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/check-collaboration-live.mjs'), read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 154,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_collaboration_live_health_check\\(\\) \\(/u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 155,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /source \"\\$\\{TEXISE_CONFIG_DIR\\}\\/texise\\.env\"/u);"
    },
    {
      "path": "scripts/r14-28-18-regression.test.mjs",
      "line": 156,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_collaboration_live_health_check 'wss:\\/\\/127\\.0\\.0\\.1\\/collab-live'/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const [pkg, sw, install, service] = await Promise.all([read('package.json'), read('packages/tooling/browser-entry/public/texise-texlive-sw.js'), read('scripts/install.sh'), read('packages/core/service-core/src/project-collaboration-service.ts')]);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(sw, /texise-app-shell-r14-28-(?:19-buildfix38|20-buildfix40|20-buildfix41|20-buildfix42|20-buildfix43|20-buildfix44|20-buildfix45|20-buildfix46|20-buildfix47|20-buildfix48|20-buildfix49|20-buildfix50)-v1/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 14,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(install, /Installing TeXise R14\\.28\\.(?:19 Build Fix 38|20 Build Fix 40|20 Build Fix 41|20 Build Fix 42|20 Build Fix 43|20 Build Fix 44|20 Build Fix 45|20 Build Fix 46|20 Build Fix 47|20 Build Fix 48|20 Build Fix 49|20 Build Fix 50)/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('BF38 ships the supplied favicon artwork with lint-safe SVG metadata while preserving the TeXise manifest', async () => {"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(manifest, /\"name\": \"TeXise\"/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(manifest, /\"short_name\": \"TeXise\"/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(favicon, /<title>TeXise favicon<\\/title>/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(telemetry, /className=\"texise-cookie-notice\" role=\"region\"/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(telemetry, /<section className=\"texise-cookie-notice\" aria-label=\"Cookie preferences\"/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 46,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(html, /apple-mobile-web-app-title\" content=\"TeXise\"/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 51,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "assert.match(app, /https:\\/\\/www\\.facebook\\.com\\/TeXiser\\//u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /https:\\/\\/x\\.com\\/texiser/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 54,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "assert.match(telemetry, />@(?:texiser|TeXiser)</u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 59,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(telemetry, /texise-cookie-consent-v1/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 79,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const [env, deploy, config, router, telemetry] = await Promise.all([read('deploy/config/texise.env.example'), read('scripts/lib/texise-deploy.sh'), read('server/config.mjs'), read('server/saas-router.mjs'), read('packages/tooling/browser-entry/src/site-telemetry.tsx')]);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 80,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(env, /TEXISE_GOOGLE_TAG_ID=/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 81,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_GOOGLE_TAG_ID ''/u);"
    },
    {
      "path": "scripts/r14-28-19-regression.test.mjs",
      "line": 89,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const [apache, app] = await Promise.all([read('deploy/apache/texise.com-https.conf'), read('packages/core/app/src/saas/saas-app.tsx')]);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(sw, /texise-app-shell-r14-28-20-buildfix(?:50|51|51-1|51-2|51-3|51-4)-v1/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 17,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(install, /Installing TeXise R14\\.28\\.20 Build Fix (?:50|51(?:\\.[123])?)/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(hero, /TeXise — Privacy First Research/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-home-hero-v2/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 37,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('BF39.1 wireframe is taller, detailed and TeXise-specific', async () => {"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 56,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(workspace, /texise-hero-editor-layer-visual[^>]*><HeroVisualPreview \\/>/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 57,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(workspace, /texise-hero-editor-layer-source[^>]*clipPath:[\\s\\S]*<HeroSourcePreview \\/>/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 66,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-hero-reveal-divider[\\s\\S]*var\\(--texise-yellow\\)/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 67,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-hero-reveal-handle[\\s\\S]*cursor: ew-resize/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 68,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-hero-editor-layer-source[\\s\\S]*background: var\\(--background\\)/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 69,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-hero-source-preview \\{ background: var\\(--background\\); \\}/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 93,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-hero-terminal-trigger[\\s\\S]*var\\(--texise-yellow\\)/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 94,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /@keyframes texise-terminal-invite/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 95,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(workspace, /texise-hero-workspace-source\\$\\{terminalOpen \\? ' is-terminal-open' : ''\\}/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 98,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-hero-workspace-source\\.is-terminal-open \\{ grid-template-rows: minmax\\(0, 1fr\\) 10rem; \\}/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 104,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(workspace, /aria-label=\"Interactive simulated TeXise editor preview\"/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 108,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(workspace, /texise-hero-static-action\" aria-hidden=\"true\">Share/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 117,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(hero, /texise-home-hero-v2/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 118,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(hero, /texise-home-hero-formulas/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 120,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(workspace, /texise-hero-workspace-grid/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 121,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-hero-workspace-wrap/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 122,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /@media \\(max-width: 1069px\\)[\\s\\S]*\\.texise-hero-workspace-files \\{ display: none; \\}/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 123,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /@media \\(max-width: 767px\\)[\\s\\S]*\\.texise-hero-workspace-pdf \\{ display: none; \\}/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 132,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(hero, /texise-home-hero-formulas/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 133,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(hero, /texise-home-hero-glow/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 135,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /var\\(--texise-yellow\\)/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 147,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /@media \\(prefers-reduced-motion: reduce\\)[\\s\\S]*\\.texise-hero-spinner[\\s\\S]*animation: none/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 150,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "test('BF39.3 floating X handle uses body font and remains @TeXiser without changing its URL', async () => {"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 156,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(telemetry, /https:\\/\\/x\\.com\\/texiser/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 157,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "assert.match(telemetry, />@TeXiser<\\/span>/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 158,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "assert.match(telemetry, /X at @TeXiser/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 159,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(telemetry, />@texiser<\\/span>/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 160,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "assert.match(app, /X at @TeXiser/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 161,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.public-x-cta \\{[\\s\\S]*font-family: var\\(--texise-font-body\\)/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 162,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(css, /\\.public-x-cta \\{[\\s\\S]{0,700}font-family: var\\(--texise-font-display\\)/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 171,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(editor, /className=\"texise-editor-toolbar flex shrink-0 items-center gap-1 border-b bg-background px-2 py-1\\.5\"/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 172,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(editor, /data-testid=\"texise-editor-toolbar\"/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 173,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /@media \\(max-width: 767px\\) \\{[\\s\\S]*\\.texise-editor-toolbar \\{[\\s\\S]*flex-wrap: nowrap[\\s\\S]*overflow-x: auto[\\s\\S]*overflow-y: hidden/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 176,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-editor-toolbar > \\* \\{ flex-shrink: 0; \\}/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 196,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-pricing-card-featured/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 197,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-hero-pdf-page/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 200,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('BF50 homepage adapts Built Awesome into six yellow Power Features and restores Explore TeXise', async () => {"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 212,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(marketing, /TeXise vs Overleaf/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 214,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(marketing, /texise-why-card texise-power-feature-card/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 215,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(workflows, /Explore TeXise/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 216,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "for (const asset of ['/texiser.webp', '/texise-lab.webp', '/texise-research.webp', '/texise-editor.webp']) assert.ok(workflows.includes(asset), `missing workflow artwork ${asset}`);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 217,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-why-card/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 218,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-home-workflow-card/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 234,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "fs.readFile('packages/tooling/browser-entry/public/og/texise-social.jpg'),"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 236,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(html, /TeXise — LaTeX Research Workspace/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 237,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(html, /https:\\/\\/www\\.texise\\.com\\/og\\/texise-social\\.jpg/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 249,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 256,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(server, /__texise\\/render/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 257,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(apache, /__texise\\/render\\//u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 258,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(app, /texise-blog-share/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 299,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 300,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 303,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(apache, /RewriteRule \\^\\$ http:\\/\\/127\\.0\\.0\\.1:3100\\/__texise\\/render\\/ \\[P,L,NE\\]/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 304,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(apache.includes('RewriteRule ^/?index\\\\.html$ https://www.texise.com/ [R=301,L,NE]'));"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 307,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /if ! texise_frontend_request '\\/'/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 308,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /if ! texise_frontend_request '\\/about'/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 315,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 316,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('deploy/systemd/texise.service'),"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 322,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_template_runtime_health_check/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 323,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(unit, /ReadWritePaths=.*\\/var\\/www\\/texise\\.com\\/templates.*dist\\/texise-templates/u);"
    },
    {
      "path": "scripts/r14-28-20-regression.test.mjs",
      "line": 350,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "['scripts/verify-texise-branding.mjs', /Branding\\/provenance audit passed/u],"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const deploy = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const busytexWorkerBridge = read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 43,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const apacheHttps = read('deploy/apache/texise.com-https.conf');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 44,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const apacheHttp = read('deploy/apache/texise.com-http.conf');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const texliveServiceWorker = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 154,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_DEPLOY_CERTIFY/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 155,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /if \\[\\[ \"\\$\\{TEXISE_DEPLOY_CERTIFY\\}\" == \"1\" \\]\\]/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 157,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_pnpm run lint:ci/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 158,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_BUSY_COMPILER_CACHE_DIR/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 302,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "// TeXise's note-only starring is fully migrated to arbitrary workspace files."
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 327,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(fetchBusytex, /\\.texise-busytex-manifest\\.json/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 337,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(busytexAdapter, /texise-busytex-worker-bridge\\.js/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 351,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(busytexAdapter, /texise_asset=/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 362,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(apacheHttp, /https:\\/\\/www\\.texise\\.com%\\{REQUEST_URI\\}/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 363,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_frontend_head_request/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 424,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(compilePanel, /texise-compile-primary/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 429,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(pdfPreview, /data-testid=\"texise-output-tabs\"/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 430,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(pdfPreview, /data-testid=\"texise-output-tabs\"/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 448,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(pageEditor, /EDITOR_PDF_SPLIT_STORAGE_KEY = 'texise:editor-pdf-split:v2'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 452,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(pageEditor, /latex-bedrive-resizer texise-drive-browser-editor-resizer hidden lg:flex/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 465,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(browserEntryCss, /\\.latex-bedrive-resizer\\.texise-drive-browser-editor-resizer/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 494,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(citationPicker, /texise:reference-providers:v1/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 495,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(citationPicker, /texise:reference-shortlist:v1:/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 534,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(aiShell, /Open TeXise AI|t\\.app\\.ai\\.open/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 543,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(localWorker, /texise-local-ai-v1/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 563,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(paperMemoryService, /texisePaperMemory/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 567,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(paperMemoryBrowser, /texise-paper-memory-v1/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 568,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(paperMemoryBrowser, /texise-paper-memory/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 705,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(projectReview, /texise-review-v1/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 713,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(visualEditor, /texise-visual-comment-anchor/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 722,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(r14270E2e, /not\\.toContain\\('TEXISE-REVIEW'\\)/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 738,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(visualEditor, /texise-visual-change-anchor/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 747,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(projectAi, /texise-ai/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 752,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(r14271E2e, /not\\.toContain\\('TEXISE-REVIEW'\\)/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 778,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(r14272E2e, /not\\.toContain\\('TEXISE-REVIEW'\\)/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 789,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(paperMemoryBrowser, /is not supported by this TeXise build/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 846,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(semanticService, /texiseProjectMeaning/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 847,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(browserPlatform, /texise-project-meaning-v1/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 856,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(tools, /texise-project-meaning-search/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 895,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(projectToolsDialog, /texise-research-review/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 898,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(citationPicker, /texise:reference-shortlist:v2:/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 899,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(citationPicker, /texise:reference-shortlist:v1:/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 930,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(pdfPreview, /texise-compile-performance/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 948,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(r14241E2e, /texise-compile-performance/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 975,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(compilerDiagnosticsList, /data-testid=\"texise-compiler-diagnostics\"/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 978,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(pdfService, /texise:pdf-view:v1:/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1016,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(pageEditor, /texise:editor-pdf-split:v2/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1017,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(pageEditor, /const EDITOR_PDF_SPLIT_STORAGE_KEY = 'texise:editor-pdf-split:v1'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1029,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(pdfPreview, /data-testid=\"texise-log-status-dot\"/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1051,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(compilePanel, /data-testid=\"texise-compiler-indicator\"/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1057,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(polishE2e, /texise-compiler-indicator/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1073,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(compilePanel, /Live PDF preview|texise-compiler-indicator/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1095,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(liveCompiler, /TEXISE_LIVE_DRAFT_DIR = '__texise_live__'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1105,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(initialize, /texiseLiveDraftProbe/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1117,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const declaration = browserLatexCompileE2e.indexOf(\"const pdfPreview = page.getByTestId('texise-pdf-preview')\");"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1129,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(compat, /TEXISE_BUSYTEXT_LEGACY_NO_BIBER_SHIM_V1/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1138,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(busytexAdapter, /texise-busytex-worker-bridge\\.js/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1157,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const deployment = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1161,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(busytexRemoteCache, /texise-busytex-remote-v3-/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1175,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deployment, /texise_migrate_env_known_default/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1176,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deployment, /TEXISE_BUSY_COMPILER_VERSION '1\\.3\\.0' '1\\.4\\.0'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1177,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deployment, /TEXISE_BUSY_COMPILER_VERSION '1\\.3\\.1' '1\\.4\\.0'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1178,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(read('scripts/fetch-busytex-assets.mjs'), /predates the Biber runtime required by TeXise full compiler mode/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1200,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(mobilePdf, /TeXise could not render this PDF page/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1284,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(interactionE2e, /texise-visual-table-actions-summary/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1306,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(visualComponent, /texise-visual-figure-placement/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1347,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "location: { origin: 'https://www.texise.com' },"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1382,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "url: 'https://www.texise.com/compiler/busytex/busytex_pipeline.js',"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1394,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(texliveServiceWorker, /texise-app-shell-r14-28-(?:15-buildfix34|16-buildfix35|17-buildfix36|18-buildfix37|19-buildfix38|20-buildfix40|20-buildfix41|20-buildfix42|20-buildfix43|20-buildfix44|20-buildfix45|20-buildfix46|20-buildfix47|20-buildfix48|20-buildfix49|20-buildfix50|20-buildfix51|20-buildfix51-1|20-buildfix51-2|20-buildfix51-3|20-buildfix51-4)-v1/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1412,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(busytexAdapter, /texise-busytex-worker-bridge\\.js/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1435,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(busytexAdapter, /texise-busytex-worker-bridge\\.js/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1447,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(busytexAdapter, /BUSYTEX_WORKER_BRIDGE_URL = '\\/compiler\\/texise-busytex-worker-bridge\\.js'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1448,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(busytexAdapter, /texise_bridge', 'buildfix25'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1473,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(texliveServiceWorker, /texise-app-shell-r14-28-(?:15-buildfix34|16-buildfix35|17-buildfix36|18-buildfix37|19-buildfix38|20-buildfix40|20-buildfix41|20-buildfix42|20-buildfix43|20-buildfix44|20-buildfix45|20-buildfix46|20-buildfix47|20-buildfix48|20-buildfix49|20-buildfix50|20-buildfix51|20-buildfix51-1|20-buildfix51-2|20-buildfix51-3|20-buildfix51-4)-v1/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1477,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(busytexAdapter, /TEXISE_BUSYTEXT_ADAPTER_RELEASE = 'buildfix25'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1479,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(prepareDist, /serviceWorkerRelease = \\/texise-app-shell-r\\\\d\\+-\\\\d\\+-\\\\d\\+-\\(buildfix\\\\d\\+\\(\\?:-\\\\d\\+\\)\\?\\)-v1\\/u/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1510,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_frontend_request '\\/texlive\\/cache\\/cm-super-ts1\\.enc'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1511,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_frontend_request '\\/texlive\\/cache\\/cm-super-ts1\\.map'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1517,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('Build Fix 21 normalizes TeXise project snapshots to BusyTeX {path, contents} UTF-8 text at the worker boundary', async () => {"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1542,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "location: { href: 'https://www.texise.com/compiler/texise-busytex-worker-bridge.js?abi=legacy-worker-bridge&engine=pdflatex' },"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1548,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "runInNewContext(busytexWorkerBridge, context, { filename: 'texise-busytex-worker-bridge.js' });"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1717,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "location: { href: 'https://www.texise.com/compiler/texise-busytex-worker-bridge.js?abi=legacy-worker-bridge&engine=pdflatex' },"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1725,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "runInNewContext(busytexWorkerBridge, context, { filename: 'texise-busytex-worker-bridge.js' });"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1826,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(conversationShell, /texise:ai-conversation-shell:size:v2/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1831,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(floatingDock, /data-testid=\"texise-ai-open\"/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 1899,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(shell, /texise-ai-evidence-pane/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2091,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(config, /\\/var\\/www\\/texise\\.com\\/public_html\\/texise-data\\/audit\\/ai-review-audit\\.sqlite3/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2130,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(browserStore, /texise-paper-memory-v1/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2163,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const http = read('deploy/apache/texise.com-http.conf');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2164,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const https = read('deploy/apache/texise.com-https.conf');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2175,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(http, /https:\\/\\/www\\.texise\\.com%\\{REQUEST_URI\\}/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2202,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(adapter, /await read\\('__texise_live__'\\);/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2204,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(liveCompiler, /texise_live_finalize/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2228,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(visual, /texise-visual-table-actions-summary[^\\n]*⋮/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2403,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(compiler, /__texise_live_instant__\\.tex/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2456,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(serverConfig, /TEXISE_AI_REVIEW_OPENAI_API_KEY/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2460,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const nativeVisual = read('packages/js-lib/latex-visual/src/native-texise-editor.ts');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2467,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(nativeVisual, /TEXISE_NATIVE_LATEX_VISUAL = true/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2519,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(bf4Unit, /assigns unique native source ids after a TeXise paragraph split/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2524,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(bf4Unit, /uses native TeXise Tab indentation and serializes nested list siblings as one LaTeX environment/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2526,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(bf4Unit, /resizes the LaTeX column specification after native TeXise column deletion and insertion/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2544,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(nativeVisual, /texise-visual-change-deletion-widget/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2547,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(releaseE2e, /latex-visual-bf4-texise-native\\.e2e\\.ts/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2548,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const bf4E2e = read('packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2554,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(bf4E2e, /BF4\\.1 simple table controls mutate TeXise structure and keep the LaTeX column spec synchronized/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2556,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(bf4E2e, /manuscript focus is borderless and the TeXise gutter handle remains clickable across the hover corridor/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2560,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(nativeVisual, /class: 'texise-latex-visual-editor'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2580,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(commentsE2e, /BF4\\.1 maps a Visual comment decoration through native TeXise typing/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2585,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const nativeVisual = read('packages/js-lib/latex-visual/src/native-texise-editor.ts');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2587,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visualE2e = read('packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2607,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(visualUnit, /never synthesizes TeXise review metadata into Visual-serialized LaTeX/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2608,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(nativeVisual, /texise-bf4-block/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2621,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(visualE2e, /TeXise block drag moves PM content and never inserts the old sentinel text/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2645,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(r14270E2e, /not\\.toContain\\('TEXISE-REVIEW'\\)/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2654,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(visualUnit, /not\\.toContain\\('TEXISE-REVIEW'\\)/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2670,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const nativeVisual = read('packages/js-lib/latex-visual/src/native-texise-editor.ts');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2680,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const nativeVisual = read('packages/js-lib/latex-visual/src/native-texise-editor.ts');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2687,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const visualE2e = read('packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2725,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(collaboration, /LEGACY_MIGRATION_VERSION|texise-collaboration-v1/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2732,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2747,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const deploy = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2751,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(collaboration, /PERSISTENCE_NAMESPACE = 'texise-collaboration-v7'/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2773,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(deploy, /texise_collaboration_live_health_check/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2785,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(health, /texiseSession\\?\\.protocolVersion === 7/);"
    },
    {
      "path": "scripts/release-runtime-hardening.test.mjs",
      "line": 2788,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(install, /repair-buildfix(?:3[456789]|4[0123456789]|50)-source\\.mjs\" \"\\$\\{TEXISE_SOURCE_ROOT\\}\"/);"
    },
    {
      "path": "scripts/release-runtime-preflight.mjs",
      "line": 14,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise preflight] ${label} ${name}: ${details}`);"
    },
    {
      "path": "scripts/release-runtime-preflight.mjs",
      "line": 126,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'.texise-busytex-manifest.json',"
    },
    {
      "path": "scripts/release-runtime-preflight.mjs",
      "line": 144,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "product: 'TeXise',"
    },
    {
      "path": "scripts/release-runtime-preflight.mjs",
      "line": 151,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise preflight] Report written to ${path.basename(reportPath)}.`);"
    },
    {
      "path": "scripts/repair-buildfix11-source.mjs",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "throw new Error(`[TeXise] Build Fix 11 source repair could not find ${adapterPath}`);"
    },
    {
      "path": "scripts/repair-buildfix11-source.mjs",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 11 source guard: BusyTeX ABI parser is already strict-TypeScript safe.');"
    },
    {
      "path": "scripts/repair-buildfix11-source.mjs",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Build Fix 11 repaired stale BusyTeX ABI parser source at ${adapterPath}`);"
    },
    {
      "path": "scripts/repair-buildfix11-source.mjs",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "`[TeXise] Build Fix 11 found an unexpected stale BusyTeX ABI parser shape in ${adapterPath}; refusing an unsafe blind rewrite.`,"
    },
    {
      "path": "scripts/repair-buildfix11-source.mjs",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "`[TeXise] Build Fix 11 could not verify the BusyTeX ABI parser source in ${adapterPath}.`,"
    },
    {
      "path": "scripts/repair-buildfix23-source.mjs",
      "line": 9,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'packages/js-lib/project-collaboration/src/texise-websocket-provider.ts',"
    },
    {
      "path": "scripts/repair-buildfix23-source.mjs",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Build Fix 23 source guard: repaired ${label}.`);"
    },
    {
      "path": "scripts/repair-buildfix23-source.mjs",
      "line": 76,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 23 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix23-source.mjs",
      "line": 81,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 23 source guard: collaboration TS7 source verified.');"
    },
    {
      "path": "scripts/repair-buildfix24-source.mjs",
      "line": 9,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'packages/js-lib/project-collaboration/src/texise-websocket-provider.ts',"
    },
    {
      "path": "scripts/repair-buildfix24-source.mjs",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Build Fix 24 source guard: repaired ${label}.`);"
    },
    {
      "path": "scripts/repair-buildfix24-source.mjs",
      "line": 90,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 24 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix24-source.mjs",
      "line": 95,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 24 source guard: collaboration TS7 source verified.');"
    },
    {
      "path": "scripts/repair-buildfix25-source.mjs",
      "line": 10,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/repair-buildfix25-source.mjs",
      "line": 42,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(service.includes('This collaboration code was created by an older TeXise version'), 'legacy collaboration codes are not rejected explicitly');"
    },
    {
      "path": "scripts/repair-buildfix25-source.mjs",
      "line": 66,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 25 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix25-source.mjs",
      "line": 68,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] The source tree is stale or only partially overlaid. Re-extract the complete BF25 public_html/ tree before installing.');"
    },
    {
      "path": "scripts/repair-buildfix25-source.mjs",
      "line": 72,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 25 source guard: upstream y-websocket collaboration and host verification verified.');"
    },
    {
      "path": "scripts/repair-buildfix26-source.mjs",
      "line": 10,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/repair-buildfix26-source.mjs",
      "line": 46,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(service.includes('This collaboration code was created by an older TeXise version'), 'legacy collaboration codes are not rejected explicitly');"
    },
    {
      "path": "scripts/repair-buildfix26-source.mjs",
      "line": 70,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 26 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix26-source.mjs",
      "line": 72,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] The source tree is stale or only partially overlaid. Re-extract the complete BF26 public_html/ tree before installing.');"
    },
    {
      "path": "scripts/repair-buildfix26-source.mjs",
      "line": 76,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "console.log('[TeXise] Build Fix 26 source guard: upstream y-websocket collaboration, host verification, and numeric legacy migration marker verified.');"
    },
    {
      "path": "scripts/repair-buildfix27-source.mjs",
      "line": 11,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/repair-buildfix27-source.mjs",
      "line": 24,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(provider.includes('texise-collaboration-v${COLLABORATION_PROTOCOL_VERSION}:${roomId}:${secret}'), 'TX4 room key is not derived solely from the self-contained token');"
    },
    {
      "path": "scripts/repair-buildfix27-source.mjs",
      "line": 28,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(library.includes(\"const PERSISTENCE_NAMESPACE = 'texise-collaboration-v4';\"), 'TX4 persistence namespace is missing');"
    },
    {
      "path": "scripts/repair-buildfix27-source.mjs",
      "line": 51,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(app.includes('data-testid=\"texise-join-project-dialog\"'), 'Projects Join Project modal is missing');"
    },
    {
      "path": "scripts/repair-buildfix27-source.mjs",
      "line": 59,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(!dialog.includes('texise-collaboration-password'), 'editor collaboration dialog still exposes a separate room password');"
    },
    {
      "path": "scripts/repair-buildfix27-source.mjs",
      "line": 77,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 27 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix27-source.mjs",
      "line": 79,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] The source tree is stale or partially overlaid. Re-extract the complete BF27 public_html/ tree before installing.');"
    },
    {
      "path": "scripts/repair-buildfix27-source.mjs",
      "line": 83,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 27 source guard: TX4 Projects-page collaboration, ready-host verification, Source cursor names, and browser-project join flow verified.');"
    },
    {
      "path": "scripts/repair-buildfix28-source.mjs",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/repair-buildfix28-source.mjs",
      "line": 29,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const serviceWorker = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/repair-buildfix28-source.mjs",
      "line": 36,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(provider.includes('texise-collaboration-v${COLLABORATION_PROTOCOL_VERSION}:${roomId}:${secret}'), 'TX5 room key is not derived from the self-contained token');"
    },
    {
      "path": "scripts/repair-buildfix28-source.mjs",
      "line": 39,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(library.includes(\"const PERSISTENCE_NAMESPACE = 'texise-collaboration-v5';\"), 'TX5 persistence namespace is missing');"
    },
    {
      "path": "scripts/repair-buildfix28-source.mjs",
      "line": 75,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(app.includes('data-testid=\"texise-project-join-loader\"'), 'full-page shared-project join loader is missing');"
    },
    {
      "path": "scripts/repair-buildfix28-source.mjs",
      "line": 90,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(serviceWorker.includes('texise-app-shell-r14-28-14-buildfix28-v1'), 'BF28 PWA cache generation is missing');"
    },
    {
      "path": "scripts/repair-buildfix28-source.mjs",
      "line": 98,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 28 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix28-source.mjs",
      "line": 100,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] The source tree is stale or partially overlaid. Re-extract the complete BF28 public_html/ tree before installing.');"
    },
    {
      "path": "scripts/repair-buildfix28-source.mjs",
      "line": 104,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 28 source guard: TX5 full-project collaboration, binary transfer, immediate file operations, ready-host verification, and join loader verified.');"
    },
    {
      "path": "scripts/repair-buildfix29-source.mjs",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/repair-buildfix29-source.mjs",
      "line": 30,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const serviceWorker = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/repair-buildfix29-source.mjs",
      "line": 37,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(provider.includes('texise-collaboration-v${COLLABORATION_PROTOCOL_VERSION}:${roomId}:${secret}'), 'TX5 room key is not derived from the self-contained token');"
    },
    {
      "path": "scripts/repair-buildfix29-source.mjs",
      "line": 40,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(library.includes(\"const PERSISTENCE_NAMESPACE = 'texise-collaboration-v5';\"), 'TX5 persistence namespace is missing');"
    },
    {
      "path": "scripts/repair-buildfix29-source.mjs",
      "line": 79,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(app.includes('data-testid=\"texise-project-join-loader\"'), 'full-page shared-project join loader is missing');"
    },
    {
      "path": "scripts/repair-buildfix29-source.mjs",
      "line": 94,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(serviceWorker.includes('texise-app-shell-r14-28-14-buildfix29-v1'), 'BF29 PWA cache generation is missing');"
    },
    {
      "path": "scripts/repair-buildfix29-source.mjs",
      "line": 102,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 29 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix29-source.mjs",
      "line": 104,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] The source tree is stale or partially overlaid. Re-extract the complete BF29 public_html/ tree before installing.');"
    },
    {
      "path": "scripts/repair-buildfix29-source.mjs",
      "line": 108,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 29 source guard: TX5 full-project collaboration, binary transfer, immediate file operations, ready-host verification, and join loader verified.');"
    },
    {
      "path": "scripts/repair-buildfix30-source.mjs",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/repair-buildfix30-source.mjs",
      "line": 30,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const serviceWorker = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/repair-buildfix30-source.mjs",
      "line": 37,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(provider.includes('texise-collaboration-v${COLLABORATION_PROTOCOL_VERSION}:${roomId}:${secret}'), 'TX5 room key is not derived from the self-contained token');"
    },
    {
      "path": "scripts/repair-buildfix30-source.mjs",
      "line": 40,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(library.includes(\"const PERSISTENCE_NAMESPACE = 'texise-collaboration-v5';\"), 'TX5 persistence namespace is missing');"
    },
    {
      "path": "scripts/repair-buildfix30-source.mjs",
      "line": 79,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(app.includes('data-testid=\"texise-project-join-loader\"'), 'full-page shared-project join loader is missing');"
    },
    {
      "path": "scripts/repair-buildfix30-source.mjs",
      "line": 99,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(serviceWorker.includes('texise-app-shell-r14-28-14-buildfix30-v1'), 'BF30 PWA cache generation is missing');"
    },
    {
      "path": "scripts/repair-buildfix30-source.mjs",
      "line": 107,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 30 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix30-source.mjs",
      "line": 109,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] The source tree is stale or partially overlaid. Re-extract the complete BF30 public_html/ tree before installing.');"
    },
    {
      "path": "scripts/repair-buildfix30-source.mjs",
      "line": 113,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 30 source guard: TX5 full-project collaboration, binary transfer, immediate file operations, ready-host verification, and join loader verified.');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 29,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const nativeVisual = read('packages/js-lib/latex-visual/src/native-texise-editor.ts');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const serviceWorker = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 42,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(provider.includes('texise-collaboration-v${COLLABORATION_PROTOCOL_VERSION}:${roomId}:${secret}'), 'TX6 room key is not derived from the self-contained token');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 45,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(library.includes(\"const PERSISTENCE_NAMESPACE = 'texise-collaboration-v6';\"), 'TX6 persistence namespace is missing');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 89,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(app.includes('data-testid=\"texise-project-join-loader\"'), 'full-page shared-project join loader is missing');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 105,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(nativeVisual.includes('computeMinimalSourceTextEdit') && nativeVisual.includes('findDiffStart') && nativeVisual.includes('texiseCollaborationProjection'), 'Visual editor does not use exact local splices and incremental remote projection transactions');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 114,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(health.includes(\"meta.set('collaborationProtocol', 6)\") && health.includes(\"meta.get('collaborationProtocol') !== 6\") && health.includes('state?.texiseSession?.protocolVersion === 6'), 'production collaboration health check does not consistently enforce TX6');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 120,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(serviceWorker.includes('texise-app-shell-r14-28-14-buildfix31-v1'), 'BF31 PWA cache generation is missing');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 128,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 31 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 130,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] The source tree is stale or partially overlaid. Re-extract the complete BF31 public_html/ tree before installing.');"
    },
    {
      "path": "scripts/repair-buildfix31-source.mjs",
      "line": 134,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 31 source guard: TX6 collaboration V2 full-project collaboration, binary transfer, immediate file operations, ready-host verification, and join loader verified.');"
    },
    {
      "path": "scripts/repair-buildfix32-source.mjs",
      "line": 18,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/repair-buildfix32-source.mjs",
      "line": 47,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(provider.includes('texise-collaboration-v${COLLABORATION_PROTOCOL_VERSION}:${roomId}:${secret}'), 'TX7 room-key derivation is missing');"
    },
    {
      "path": "scripts/repair-buildfix32-source.mjs",
      "line": 51,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(library.includes(\"const PERSISTENCE_NAMESPACE = 'texise-collaboration-v7';\"), 'TX7 persistence namespace is missing');"
    },
    {
      "path": "scripts/repair-buildfix32-source.mjs",
      "line": 112,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(service.includes(\"const COLLAB_USER_ID_KEY = 'texise-collaboration-user-id'\"), 'stable collaborator browser ID is missing');"
    },
    {
      "path": "scripts/repair-buildfix32-source.mjs",
      "line": 113,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(service.includes(\"const COLLAB_USER_NAME_KEY = 'texise-collaboration-name'\"), 'stable collaborator browser name is missing');"
    },
    {
      "path": "scripts/repair-buildfix32-source.mjs",
      "line": 114,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(service.includes(\"const COLLAB_USER_COLOR_KEY = 'texise-collaboration-color'\"), 'stable collaborator browser color is missing');"
    },
    {
      "path": "scripts/repair-buildfix32-source.mjs",
      "line": 129,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(collaborationE2e.includes(\"process.env.TEXISE_RELEASE_QUALITY !== '1'\"), 'formal release quality does not require the TX7 soak');"
    },
    {
      "path": "scripts/repair-buildfix32-source.mjs",
      "line": 152,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 32 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix32-source.mjs",
      "line": 154,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] The source tree is stale, partially overlaid, or still exposes a competing TX6 live collaboration path.');"
    },
    {
      "path": "scripts/repair-buildfix32-source.mjs",
      "line": 158,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "console.log('[TeXise] Build Fix 32 source guard: TX7 TeXlyre-style Source collaboration, link/QR joining, one-way Y.Text mirroring, Source-only editing, structure locking, session stopping, dependency pins, and attribution verified.');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 27,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 38,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const apache = read('deploy/apache/texise.com-https.conf');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 42,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const gatewayPackage = json('texise-services/console-gateway/package.json');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 45,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 46,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const sw = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 56,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(read('scripts/texise-saas').includes('--pty') && !read('scripts/texise-saas').includes('--pipe --pty'), 'admin-create systemd-run does not use a valid interactive PTY invocation');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 85,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(!library.includes('texise-collaboration-v1'), 'legacy-v1 IndexedDB migration remains in per-session hot path');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 86,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(service.includes(\"RECOVERY_DIRECTORY = '.texise-local-recovery'\"), 'safe local rejoin recovery is missing');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 92,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(collaborationE2e.includes('BF33/TX7.1 preserves one Source Yjs binding') && collaborationE2e.includes('You are hosting') && collaborationE2e.includes('LOCAL-DIVERGENT-MAIN') && collaborationE2e.includes('.texise-local-recovery/'), 'BF33 collaboration lifecycle/recovery E2E contract is missing');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 99,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(apache.includes(\"connect-src 'self' https: wss://www.texise.com http://127.0.0.1:* http://localhost:*;\"), 'production CSP must restrict WebSockets while allowing only loopback Ollama HTTP endpoints');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 124,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sw.includes('texise-app-shell-r14-28-14-buildfix33-v1') || sw.includes('texise-app-shell-r14-28-15-buildfix34-v1') || sw.includes('texise-app-shell-r14-28-16-buildfix35-v1') || sw.includes('texise-app-shell-r14-28-17-buildfix36-v1') || sw.includes('texise-app-shell-r14-28-18-buildfix37-v1') || sw.includes('texise-app-shell-r14-28-19-buildfix38-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix40-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix41-v1') || (sw.includes"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 125,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.14 Build Fix 33') && install.includes('repair-buildfix33-source.mjs')) || (install.includes('Installing TeXise R14.28.15 Build Fix 34') && install.includes('repair-buildfix34-source.mjs')) || (install.includes('Installing TeXise R14.28.16 Build Fix 35') && install.includes('repair-buildfix35-source.mjs')) || (install.includes('Installing TeXise R14.28.17 Build Fix 36') && install.includes('repair-buildfix36-source.mjs')) || (install.inclu"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 129,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 33 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix33-source.mjs",
      "line": 133,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 33 source guard: BF32/TX7 preserved; TX7.1 admin, relay, lifecycle, rejoin, persistence, canonical-source, CSP and dependency hardening verified.');"
    },
    {
      "path": "scripts/repair-buildfix34-source.mjs",
      "line": 36,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const sw = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/repair-buildfix34-source.mjs",
      "line": 38,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/repair-buildfix34-source.mjs",
      "line": 42,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sw.includes('texise-app-shell-r14-28-15-buildfix34-v1') || sw.includes('texise-app-shell-r14-28-16-buildfix35-v1') || sw.includes('texise-app-shell-r14-28-17-buildfix36-v1') || sw.includes('texise-app-shell-r14-28-18-buildfix37-v1') || sw.includes('texise-app-shell-r14-28-19-buildfix38-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix40-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix41-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix42-v1') || (sw.include"
    },
    {
      "path": "scripts/repair-buildfix34-source.mjs",
      "line": 43,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.15 Build Fix 34') && install.includes('repair-buildfix34-source.mjs')) || (install.includes('Installing TeXise R14.28.16 Build Fix 35') && install.includes('repair-buildfix35-source.mjs')) || (install.includes('Installing TeXise R14.28.17 Build Fix 36') && install.includes('repair-buildfix36-source.mjs')) || (install.includes('Installing TeXise R14.28.18 Build Fix 37') && install.includes('repair-buildfix37-source.mjs')) || (install.inclu"
    },
    {
      "path": "scripts/repair-buildfix34-source.mjs",
      "line": 134,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(saas.includes(\"texise-projects-page--empty\") && saas.includes('texise-projects-empty-state') && css.includes('.texise-projects-page--empty') && css.includes('.texise-projects-empty-state'), 'Projects empty-state layout is not scoped to the Projects page');"
    },
    {
      "path": "scripts/repair-buildfix34-source.mjs",
      "line": 138,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 34 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix34-source.mjs",
      "line": 142,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "console.log('[TeXise] Build Fix 34 source guard: TX7.1 preserved; TX7.2 shared Comments, Track Changes, conflict handling, mutation attribution, undo integration and Projects polish verified.');"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 21,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const visualNative = read('packages/js-lib/latex-visual/src/native-texise-editor.ts');"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 39,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const sw = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 41,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 45,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sw.includes('texise-app-shell-r14-28-16-buildfix35-v1') || sw.includes('texise-app-shell-r14-28-17-buildfix36-v1') || sw.includes('texise-app-shell-r14-28-18-buildfix37-v1') || sw.includes('texise-app-shell-r14-28-19-buildfix38-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix40-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix41-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix42-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix43-v1') || (sw.includ"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 46,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.16 Build Fix 35') && install.includes('repair-buildfix35-source.mjs')) || (install.includes('Installing TeXise R14.28.17 Build Fix 36') && install.includes('repair-buildfix36-source.mjs')) || (install.includes('Installing TeXise R14.28.18 Build Fix 37') && install.includes('repair-buildfix37-source.mjs')) || (install.includes('Installing TeXise R14.28.19 Build Fix 38') && install.includes('repair-buildfix38-source.mjs')) || ((install.incl"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 83,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"COLLABORATION_REVIEW_UNDO_IDS_META_KEY = 'texiseReviewChangeIds'\","
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 84,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "\"COLLABORATION_REVIEW_UNDO_SNAPSHOT_META_KEY = 'texiseReviewUndoSnapshot'\","
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 93,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(capabilities.includes(\"COLLABORATION_REVIEW_TRANSACTION_META_KEY = 'texiseReviewMutation'\"), 'review mutation transaction-meta key is missing');"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 115,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(features.includes('cm-texise-review-conflicted') && features.includes('border-bottom') === false ? true : features.includes('cm-texise-review-conflicted'), 'explicit conflicted Source review class is missing');"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 116,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(features.includes(\"'.cm-texise-review-conflicted'\"), 'conflicted Source review decoration has no dedicated theme rule');"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 121,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "for (const retired of ['LatexVisualCollaborationDecoration', 'LatexVisualCollaborationAuthorshipDecoration', 'updateCollaborationDecorations', 'updateCollaborationAuthorshipDecorations', 'nativeCollaborationDecoration', 'visual-collaborator-cursor', 'visual-collaborator-authorship', 'cm-texise-collaboration-authorship']) {"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 150,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 35 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix35-source.mjs",
      "line": 154,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 35 source guard: BF34/TX7.2 preserved; TX7.2.1 file-bound review anchors, atomic CRDT metadata, capability isolation, exact Undo correlation, semantic mutation metadata, review quotas/performance, accessible review controls, TypeScript closure narrowing, UX and review soak contracts verified.');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const sw = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 19,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sw.includes('texise-app-shell-r14-28-17-buildfix36-v1') || sw.includes('texise-app-shell-r14-28-18-buildfix37-v1') || sw.includes('texise-app-shell-r14-28-19-buildfix38-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix40-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix41-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix42-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix43-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix44-v1') || (sw.inclu"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 34,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.17 Build Fix 36') && install.includes('repair-buildfix36-source.mjs')) || (install.includes('Installing TeXise R14.28.18 Build Fix 37') && install.includes('repair-buildfix37-source.mjs')) || (install.includes('Installing TeXise R14.28.19 Build Fix 38') && install.includes('repair-buildfix38-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 40') && (install.includes('repair-buildfix39-source.mjs') || install.inclu"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 46,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(accountPopover.includes('texise-account-popover'), 'shared account popover styling is not reused');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 52,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(!wsCss.includes('texise-editor-account-popover'), 'obsolete editor-specific account popover remains');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 54,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(app.includes('srcSet=\"/texise-logo-mobile.png\"') && app.includes('src=\"/texise-logo.png\"'), 'responsive desktop/mobile logo sources are missing');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 55,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(fs.existsSync(path.join(root, 'packages/tooling/browser-entry/public/texise-logo.png')), 'desktop texise-logo.png is missing');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 56,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(fs.existsSync(path.join(root, 'packages/tooling/browser-entry/public/texise-logo-mobile.png')), 'mobile texise-logo-mobile.png is missing');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(!app.includes('texise-brand-mark') && !app.includes('texise-brand-word'), 'legacy generated brand mark/word remains active');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 58,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-brand-logo') && !css.includes('.texise-brand-mark') && !css.includes('.texise-brand-word'), 'brand CSS was not migrated to responsive image assets');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 76,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(settings.includes('texise-account-metadata') && settings.includes('role=\"group\" aria-label=\"Account details\"'), 'account metadata is not a small semantic line-by-line group below Display name');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 77,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "requireSource(settings.includes('texise-settings-entitlement-stack') && settings.includes('<LicenseLinkCard inputId=\"settings-license-key\" />'), 'Settings does not reuse the separate shared Pro license card below account entitlement');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 78,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "requireSource(licenseCard.includes('setLicenseError(licenseErrorCopy(reason))') && licenseCard.includes('texise-license-error'), 'license verification does not expose the bounded inline error state');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 79,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "requireSource(css.includes('.texise-account-metadata') && css.includes('.texise-license-link-card') && css.includes('.texise-license-success'), 'Settings/Pro license UI polish styles are missing');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 84,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 36 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix36-source.mjs",
      "line": 88,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 36 source guard: BF35/TX7.2.1 preserved; collaboration modal, authenticated identity, shared account popover, native details/summary accessibility, responsive brand assets, Settings entitlement/Lifetime Deal UX and session-backed provider metadata verified.');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 19,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const sw = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 21,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const provider = read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 37,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const designCss = read('packages/tooling/browser-entry/src/texise-design.css');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 44,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sw.includes('texise-app-shell-r14-28-18-buildfix37-v1') || sw.includes('texise-app-shell-r14-28-19-buildfix38-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix40-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix41-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix42-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix43-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix44-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix45-v1') || (sw.incl"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 45,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.18 Build Fix 37') && install.includes('repair-buildfix37-source.mjs')) || (install.includes('Installing TeXise R14.28.19 Build Fix 38') && install.includes('repair-buildfix38-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 40') && (install.includes('repair-buildfix39-source.mjs') || install.includes('repair-buildfix40-source.mjs'))) || ((install.includes('Installing TeXise R14.28.20 Build Fix 41') && install.inc"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 60,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(deploy.includes('texise_collaboration_live_health_check() (') && deploy.includes('source \"${TEXISE_CONFIG_DIR}/texise.env\"') && deploy.includes(\"texise_collaboration_live_health_check 'wss://127.0.0.1/collab-live'\"), 'deployment live-relay health check does not export the trusted SaaS signing environment into the checker subprocess');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 66,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sha256('packages/tooling/browser-entry/public/texise-logo.png') === 'bf20e9926881af7ef40c34cda89a12b61c6340c607ad366cf63a6a1235bc62fc', 'BF37 desktop logo is not the newly supplied 935x233 asset');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 67,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(app.includes('srcSet=\"/texise-logo-mobile.png\"') && app.includes('src=\"/texise-logo.png\"'), 'responsive desktop/mobile brand switching was lost');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 72,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(editor.includes('FlaskConical') && (editor.includes('TexLab') || editor.includes('TeXise Terminal')) && !editor.includes('SquareTerminal'), 'editor toolbar does not expose TexLab with a lab icon');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 85,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(account.includes('createPortal') && account.includes('texise-account-popover-portal') && account.includes('aria-expanded={open}') && account.includes('useDismissiblePopover'), 'home/editor account dropdown is not a shared portal-based dismissible popover');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 86,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(saasCss.includes('.texise-account-popover-portal'), 'portal account-popover positioning style is missing');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 90,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 37 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix37-source.mjs",
      "line": 94,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 37 source guard: BF36/TX7.2.2 preserved; server-authoritative Pro/Admin collaboration hosting, signed relay grants, new desktop brand, larger Visual typography, TexLab/shared terminal chrome, toolbar/CTA/account/project-menu UX and strict tsgo host-grant integration and signed production relay health certification verified.');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 19,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const sw = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 21,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 32,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const envExample = read('deploy/config/texise.env.example');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 33,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const apache = read('deploy/apache/texise.com-https.conf');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 36,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sw.includes('texise-app-shell-r14-28-19-buildfix38-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix40-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix41-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix42-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix43-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix44-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix45-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix46-v1') || (sw.inc"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 37,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.19 Build Fix 38') && install.includes('repair-buildfix38-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 40') && (install.includes('repair-buildfix39-source.mjs') || install.includes('repair-buildfix40-source.mjs'))) || ((install.includes('Installing TeXise R14.28.20 Build Fix 41') && install.includes('repair-buildfix41-source.mjs')) || (((install.includes('Installing TeXise R14.28.20 Build Fix 42') && install.i"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 50,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(read('packages/tooling/browser-entry/public/favicon.svg').includes('<title>TeXise favicon</title>'), 'BF38 favicon SVG must carry a non-empty accessibility title for Biome');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 52,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(telemetrySource.includes('aria-label=\"Cookie preferences\"') && !telemetrySource.includes('className=\"texise-cookie-notice\" role=\"region\"'), 'BF38 cookie notice must rely on semantic section region behavior without redundant role=region');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 56,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(indexHtml.includes('<meta name=\"apple-mobile-web-app-title\" content=\"TeXise\" />'), 'Apple mobile web-app title is missing');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(manifest.includes('\"name\": \"TeXise\"') && manifest.includes('\"short_name\": \"TeXise\"') && !manifest.includes('MyWebSite') && !manifest.includes('MySite'), 'generic uploaded manifest must not replace TeXise PWA identity');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 59,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "requireSource(app.includes('https://www.facebook.com/TeXiser/') && app.includes('https://x.com/texiser') && app.includes('texise-footer-socials'), 'footer Facebook/X social links are missing');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 60,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "requireSource(telemetry.includes('data-public-x-cta=\"true\"') && (telemetry.includes('@texiser') || telemetry.includes('@TeXiser')) && telemetry.includes('https://x.com/texiser'), 'floating X CTA is missing');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 61,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(telemetry.includes(\"const COOKIE_PREFERENCE_KEY = 'texise-cookie-consent-v1'\") && telemetry.includes('Accept cookies') && telemetry.includes('Decline cookies') && telemetry.includes('href=\"/privacy\"'), 'cookie preference notice contract is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 62,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-cookie-notice') && css.includes('.public-x-cta') && css.includes('.texise-footer-socials'), 'BF38 social/cookie responsive styling is missing');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 69,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "requireSource(envExample.includes('TEXISE_GOOGLE_TAG_ID=') && deploy.includes(\"texise_ensure_env_default \\\"${env_file}\\\" TEXISE_GOOGLE_TAG_ID ''\"), 'TEXISE_GOOGLE_TAG_ID is not provisioned/preserved in /etc/texise/texise.env');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 70,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(serverConfig.includes('parseOptionalGoogleTagId') && serverConfig.includes('googleTagId: parseOptionalGoogleTagId(env.TEXISE_GOOGLE_TAG_ID)'), 'trusted server does not validate/read TEXISE_GOOGLE_TAG_ID');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 77,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 38 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix38-source.mjs",
      "line": 81,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 38 source guard: BF37/TX7.2.3 preserved; supplied favicon suite, TeXise PWA identity, footer/sticky social links, non-admin Statcounter, optional consent-gated Google Tag provisioning, cookie notice, CSP, privacy and accessibility-lint contracts verified.');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const sw = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 19,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 31,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((sw.includes('texise-app-shell-r14-28-20-buildfix40-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix41-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix42-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix43-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix44-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix45-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix46-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix47-v1') || (sw.in"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(((install.includes('Installing TeXise R14.28.20 Build Fix 40') && (install.includes('repair-buildfix39-source.mjs') || install.includes('repair-buildfix40-source.mjs'))) || ((install.includes('Installing TeXise R14.28.20 Build Fix 41') && install.includes('repair-buildfix41-source.mjs')) || (((install.includes('Installing TeXise R14.28.20 Build Fix 42') && install.includes('repair-buildfix42-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 43') && install."
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 38,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(hero.includes('texise-home-hero-v2') && hero.includes('TeXise — Privacy First Research'), 'BF50 restored TeXise hero is missing');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 41,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(!hero.includes('Thetapad') && !hero.includes('Join 10,000+') && !hero.includes('Try Without Signing Up') && !hero.includes('LetX'), 'BF50 public hero must stay TeXise-specific');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 43,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(marketing.includes('Power Features') && marketing.includes('TeXise vs Overleaf') && marketing.includes('Visual Editing') && (marketing.includes('Unlimited AI') || marketing.includes('AI your way')) && marketing.includes('Local Compile'), 'BF50 replacement public feature/comparison sections are incomplete');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 45,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "for (const token of ['/favicon.svg', 'Research Paper', 'Source', 'Visual', 'Navigator', 'TikZ', 'AI Review', 'Review', 'Tools', 'main.tex', 'references.bib', 'PDF', 'Terminal']) requireSource(workspace.includes(token), `BF39.1 TeXise wireframe missing ${token}`);"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 50,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(workspace.includes('aria-label=\"Interactive simulated TeXise editor preview\"') && workspace.includes('role=\"group\" aria-label=\"Simulated editor mode\"'), 'BF39.1 interactive preview semantics are incomplete');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 53,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-home-hero-v2') && css.includes('min-height: calc(100svh - 5.3rem)') && css.includes('.texise-hero-workspace-grid'), 'BF39 full-height workspace composition is missing');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 54,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-home-hero-title {') && css.includes('@media (min-width: 1024px)') && css.includes('font-size: 3.5rem'), 'BF39.1 restrained desktop headline sizing is missing');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 55,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-hero-workspace-wrap') && css.includes('width: min(100%, 70rem)') && css.includes('margin-top: 3.25rem'), 'BF39.1 wireframe width/headline spacing is missing');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 57,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-hero-terminal-trigger') && css.includes('@keyframes texise-terminal-invite') && css.includes('var(--texise-yellow)'), 'BF39.1 highlighted Terminal affordance is missing');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 58,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('@media (max-width: 1069px)') && css.includes('.texise-hero-workspace-files { display: none; }'), 'BF39 tablet wireframe simplification is missing');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 59,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('@media (max-width: 767px)') && css.includes('.texise-hero-workspace-pdf { display: none; }'), 'BF39 mobile editor-focused wireframe is missing');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 60,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('@media (prefers-reduced-motion: reduce)') && css.includes('.texise-hero-spinner') && css.includes('animation: none'), 'BF39.1 hero simulation does not honor reduced-motion preferences');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 61,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('var(--texise-yellow)') && hero.includes('texise-home-hero-v2') && hero.includes('texise-home-hero-formulas') && !hero.includes('texise-home-hero-glow'), 'BF50 restored hero and BF39 product visual boundary are missing');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 62,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-hero-editor-compare') && css.includes('.texise-hero-reveal-divider') && css.includes('.texise-hero-reveal-handle') && css.includes('cursor: ew-resize'), 'BF39.2 Source/Visual reveal slider styling is missing');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 63,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-hero-editor-layer-source') && css.includes('background: var(--background);') && css.includes('.texise-hero-source-preview { background: var(--background); }'), 'BF39.2 Source reveal must be fully opaque so Visual content cannot bleed through LaTeX');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 64,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(editorPage.includes('className=\"texise-editor-toolbar flex shrink-0 items-center gap-1 border-b bg-background px-2 py-1.5\"') && editorCss.includes('@media (max-width: 767px)') && editorCss.includes('.texise-editor-toolbar') && editorCss.includes('overflow-x: auto') && editorCss.includes('flex-wrap: nowrap') && editorCss.includes('flex-shrink: 0'), 'BF39.2 real mobile editor toolbar must scroll horizontally without shrinking controls');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 66,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "requireSource(telemetry.includes('>@TeXiser</span>') && telemetry.includes('https://x.com/texiser') && !telemetry.includes('>@texiser</span>'), 'floating X CTA must display @TeXiser while keeping the x.com/texiser URL');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 67,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.public-x-cta {') && css.includes('font-family: var(--texise-font-body);'), 'BF39.3 floating X CTA must use the normal body font');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 70,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(app.includes('<HomePowerFeatures />') && app.includes('<HomeWorkflowsShowcase />') && app.includes('<HomeProductComparison />') && !app.includes('<HomeFeatureShowcase />'), 'BF50 must adapt Built Awesome into Power Features and render the approved Explore TeXise workflow section');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 72,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-why-card') && css.includes('.texise-home-workflow-card') && css.includes('.texise-product-comparison') && css.includes('.texise-pricing-card-featured'), 'BF50 restored public section styling is missing');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 75,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(workspace.includes(\"texise-hero-workspace-source${terminalOpen ? ' is-terminal-open' : ''}\") && css.includes('.texise-hero-workspace-source.is-terminal-open { grid-template-rows: minmax(0, 1fr) 10rem; }'), 'BF39.3 simulated Terminal must be confined to the Source/Visual editor column');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 76,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('linear-gradient(180deg, color-mix(in srgb, var(--texise-yellow) 4%, var(--background)) 0%, var(--background) 25%, var(--background) 100%)'), 'BF39.3 exact hero background gradient is missing');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 77,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-hero-pdf-page {') && css.includes('width: min(94%, 15rem); border-radius: .55rem;'), 'BF39.3 desktop PDF page must be slightly wider with rounded corners');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 80,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 39 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix39-source.mjs",
      "line": 84,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 39 source guard: BF38 foundation preserved; BF39 interactive Source/Visual product simulation, editor-column Terminal, rounded PDF, mobile toolbar and @TeXiser controls remain verified under the BF50 public-site redesign.');"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 31,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const branding = spawnSync(process.execPath, [resolve(root, 'scripts/verify-texise-branding.mjs'), root], { encoding: 'utf8' });"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 36,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 38,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 44,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 49,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/og/texise-social.jpg', null),"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 53,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sw.includes('texise-app-shell-r14-28-20-buildfix40-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix41-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix42-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix43-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix44-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix45-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix46-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix47-v1') || (sw.inc"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 54,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.20 Build Fix 40') && install.includes('repair-buildfix40-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 41') && install.includes('repair-buildfix41-source.mjs')) || (((install.includes('Installing TeXise R14.28.20 Build Fix 42') && install.includes('repair-buildfix42-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 43') && install.includes('repair-buildfix43-source.mjs')) || ((install."
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 60,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const imageStat = await stat(resolve(root, 'packages/tooling/browser-entry/public/og/texise-social.jpg'));"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 64,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'TeXise — LaTeX Research Workspace',"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 65,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'TeXise — Privacy First Research Writing Platform',"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 66,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'TeXise — Local-First Overleaf Alternative LaTeX Research Editor with CLI',"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 67,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'Online LaTeX Editor for Scientific Research Writing | TeXise',"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 73,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'https://www.texise.com/og/texise-social.jpg', 'TeXise Blog RSS',"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 75,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(!html.includes('preload\" href=\"/texise-fonts/Moranga') && !html.includes('preload\" href=\"/texise-fonts/STIX'), 'non-critical Moranga/STIX font preloads must not compete with above-the-fold resources');"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 82,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "for (const token of ['renderBlogRssXml', 'xmlns:image=', 'media:content', 'Disallow: /__texise']) requireSource(publicIndex.includes(token), `public index/RSS layer missing: ${token}`);"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 83,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(apache.includes('/__texise/render/') && apache.includes('[P,L,NE]') && apache.includes('/blog/rss.xml'), 'Apache does not route extensionless pages through the server SEO renderer/RSS endpoint');"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 84,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "for (const token of ['twitter:card', \"image || '/og/texise-social.jpg'\", 'article:modified_time', 'texise-blog-share', 'twitter.com/intent/tweet', 'linkedin.com/sharing/share-offsite', 'facebook.com/sharer/sharer.php', 'navigator.share', 'navigator.clipboard.writeText']) {"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 87,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-blog-share'), 'blog share controls are missing release styling');"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 89,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "requireSource(brandingAudit.includes('Hotfix9 / Build Fix 40 TeXise Branding & Provenance Audit') && brandingAudit.includes('Approved residual upstream reference classes'), 'Hotfix9 branding/provenance audit documentation is missing');"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 97,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 40 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix40-source.mjs",
      "line": 101,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "console.log('[TeXise] Build Fix 40 source guard: BF39 UI preserved; server-rendered SEO, 1200x630 social image, blog-cover OG, JSON-LD, RSS/image sitemap, real 404/noindex routing, article social sharing, TeXise core branding and narrow provenance exceptions verified.');"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 28,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const branding = spawnSync(process.execPath, [resolve(root, 'scripts/verify-texise-branding.mjs'), root], { encoding: 'utf8' });"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 51,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/og/texise-social.jpg', null),"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 56,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sw.includes('texise-app-shell-r14-28-20-buildfix41-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix42-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix43-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix44-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix45-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix46-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix47-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix48-v1') || (sw.inc"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.20 Build Fix 41') && install.includes('repair-buildfix41-source.mjs')) || (((install.includes('Installing TeXise R14.28.20 Build Fix 42') && install.includes('repair-buildfix42-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 43') && install.includes('repair-buildfix43-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 44') && install.includes('repair-buildfix44-source.mjs')) || ((install."
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 61,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const titles = ['TeXise — LaTeX Research Workspace', 'TeXise — Local-First Overleaf Alternative LaTeX Research Editor with CLI', 'TeXise — Privacy First Research Writing Platform'];"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 68,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(apache.includes('^/texise-templates/(free|pro)/') && apache.includes('Require all denied'), 'raw template source trees are not denied by Apache');"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 69,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(templateManifest.includes('/api/templates/${encodeURIComponent(slug)}/files/') && !templateManifest.includes(\"publicPath: `/texise-templates/${tier}/\"), 'template manifest does not use protected API source delivery');"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 80,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(html.includes('name=\"twitter:site\" content=\"@texiser\"') && html.includes('\"sameAs\"'), 'generic social/entity metadata is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 83,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(dimensions?.width === 1200 && dimensions?.height === 630, 'generic TeXise OG fallback must remain 1200x630');"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 84,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const imageStat = await stat(resolve(root, 'packages/tooling/browser-entry/public/og/texise-social.jpg'));"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 97,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 41 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix41-source.mjs",
      "line": 101,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "console.log('[TeXise] Build Fix 41 source guard: Hotfix9 foundation preserved; template CMS/filesystem sync, institution taxonomy, protected source delivery, legacy template SEO migration, hydration-safe indexing, enriched schema, interactive Learn handoff, research content and TeXise branding verified.');"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 28,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const branding = spawnSync(process.execPath, [resolve(root, 'scripts/verify-texise-branding.mjs'), root], { encoding: 'utf8' });"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 52,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/og/texise-social.jpg', null),"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 57,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((sw.includes('texise-app-shell-r14-28-20-buildfix42-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix43-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix44-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix45-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix46-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix47-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix48-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix49-v1') || (sw.in"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 58,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(((install.includes('Installing TeXise R14.28.20 Build Fix 42') && install.includes('repair-buildfix42-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 43') && install.includes('repair-buildfix43-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 44') && install.includes('repair-buildfix44-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 45') && install.includes('repair-buildfix45-source.mjs')) || ((install."
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 62,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const titles = ['TeXise — LaTeX Research Workspace', 'TeXise — Local-First Overleaf Alternative LaTeX Research Editor with CLI', 'TeXise — Privacy First Research Writing Platform'];"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 69,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(apache.includes('^/texise-templates/(free|pro)/') && apache.includes('Require all denied'), 'raw template source trees are not denied by Apache');"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 70,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(templateManifest.includes('/api/templates/${encodeURIComponent(slug)}/files/') && !templateManifest.includes(\"publicPath: `/texise-templates/${tier}/\"), 'template manifest does not use protected API source delivery');"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 81,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(html.includes('name=\"twitter:site\" content=\"@texiser\"') && html.includes('\"sameAs\"'), 'generic social/entity metadata is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 84,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(dimensions?.width === 1200 && dimensions?.height === 630, 'generic TeXise OG fallback must remain 1200x630');"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 85,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const imageStat = await stat(resolve(root, 'packages/tooling/browser-entry/public/og/texise-social.jpg'));"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 104,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 42 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix42-source.mjs",
      "line": 108,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 42 source guard: Hotfix10 foundation preserved; production tsgo blockers fixed for Web Share feature detection, BibTeX capture narrowing and template metadata test fixtures.');"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 28,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const branding = spawnSync(process.execPath, [resolve(root, 'scripts/verify-texise-branding.mjs'), root], { encoding: 'utf8' });"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 53,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/og/texise-social.jpg', null),"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 58,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((sw.includes('texise-app-shell-r14-28-20-buildfix43-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix44-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix45-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix46-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix47-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix48-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix49-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix50-v1') || (sw.in"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 59,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.20 Build Fix 43') && install.includes('repair-buildfix43-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 44') && install.includes('repair-buildfix44-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 45') && install.includes('repair-buildfix45-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 46') && install.includes('repair-buildfix46-source.mjs')) || ((install.i"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 63,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const titles = ['TeXise — LaTeX Research Workspace', 'TeXise — Local-First Overleaf Alternative LaTeX Research Editor with CLI', 'TeXise — Privacy First Research Writing Platform'];"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 70,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(apache.includes('^/texise-templates/(free|pro)/') && apache.includes('Require all denied'), 'raw template source trees are not denied by Apache');"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 71,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(templateManifest.includes('/api/templates/${encodeURIComponent(slug)}/files/') && !templateManifest.includes(\"publicPath: `/texise-templates/${tier}/\"), 'template manifest does not use protected API source delivery');"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 82,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(html.includes('name=\"twitter:site\" content=\"@texiser\"') && html.includes('\"sameAs\"'), 'generic social/entity metadata is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 85,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(dimensions?.width === 1200 && dimensions?.height === 630, 'generic TeXise OG fallback must remain 1200x630');"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 86,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const imageStat = await stat(resolve(root, 'packages/tooling/browser-entry/public/og/texise-social.jpg'));"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 113,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 43 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix43-source.mjs",
      "line": 117,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 43 source guard: Hotfix10 and BF42 typecheck foundation preserved; production Biome lint blockers fixed in Learn examples, metadata cleanup callbacks and Admin table JSX.');"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 18,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 19,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('deploy/systemd/texise.service'),"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 29,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((sw.includes('texise-app-shell-r14-28-20-buildfix44-v1') || sw.includes('texise-app-shell-r14-28-20-buildfix45-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix46-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix47-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix48-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix49-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix50-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-v1') || (sw.inc"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 30,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.20 Build Fix 44') && install.includes('repair-buildfix44-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 45') && install.includes('repair-buildfix45-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 46') && install.includes('repair-buildfix46-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 47') && install.includes('repair-buildfix47-source.mjs')) || (((install."
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(manifestCore.includes('TEXISE_TEMPLATE_ROOT') && manifestCore.includes('TEXISE_TEMPLATE_PUBLIC_COPY'), 'template manifest core does not honor deployed runtime paths');"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 39,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(deploy.includes('check-staged-trusted-runtime.mjs') && deploy.includes('TEXISE_TEMPLATE_PUBLIC_COPY'), 'deployment does not verify the staged trusted runtime/module paths');"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(deploy.includes(\"printf 'TEXISE_TEMPLATE_ROOT=%s\\\\n'\") && deploy.includes(\"printf 'TEXISE_TEMPLATE_PUBLIC_COPY=%s\\\\n'\"), 'runtime release.env does not carry canonical template paths');"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 41,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(deploy.includes('texise_prepare_template_runtime_permissions()') && install.includes('texise_prepare_template_runtime_permissions') && upgrade.includes('texise_prepare_template_runtime_permissions'), 'installer/upgrade does not prepare Admin template filesystem permissions');"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 42,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(deploy.includes('texise_template_runtime_health_check()') && deploy.includes('ProtectSystem=strict'), 'deployment lacks sandboxed template write-boundary health verification');"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 44,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "requireSource(unit.includes('/var/www/texise.com/templates') && unit.includes('/var/www/texise.com/public_html/dist/texise-templates'), 'systemd trusted runtime is not granted the persistent template source and generated catalog write paths');"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 49,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 44 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix44-source.mjs",
      "line": 53,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 44 source guard: BF43 production build preserved; trusted template runtime is self-contained, live filesystem paths are writable under the service sandbox, and public Assets Sync is catalog-only.');"
    },
    {
      "path": "scripts/repair-buildfix45-source.mjs",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix45-source.mjs",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix45-source.mjs",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/repair-buildfix45-source.mjs",
      "line": 25,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sw.includes('texise-app-shell-r14-28-20-buildfix45-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix46-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix47-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix48-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix49-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix50-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (sw.i"
    },
    {
      "path": "scripts/repair-buildfix45-source.mjs",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.20 Build Fix 45') && install.includes('repair-buildfix45-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 46') && install.includes('repair-buildfix46-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 47') && install.includes('repair-buildfix47-source.mjs')) || (((install.includes('Installing TeXise R14.28.20 Build Fix 48') && install.includes('repair-buildfix48-source.mjs')) || ((install."
    },
    {
      "path": "scripts/repair-buildfix45-source.mjs",
      "line": 30,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(apache.includes('RewriteRule ^$ http://127.0.0.1:3100/__texise/render/ [P,L,NE]'), 'BF45 does not route the homepage through the trusted renderer');"
    },
    {
      "path": "scripts/repair-buildfix45-source.mjs",
      "line": 31,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(apache.includes('RewriteRule ^/?index\\\\.html$ https://www.texise.com/ [R=301,L,NE]'), 'BF45 does not canonicalize /index.html to /');"
    },
    {
      "path": "scripts/repair-buildfix45-source.mjs",
      "line": 33,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(deploy.includes('TeXise frontend route diagnostics follow:') && deploy.includes('for probe_path in / /index.html /about'), 'BF45 frontend failure diagnostics are incomplete');"
    },
    {
      "path": "scripts/repair-buildfix45-source.mjs",
      "line": 38,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 45 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix45-source.mjs",
      "line": 42,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 45 source guard: BF44 trusted runtime preserved; Apache homepage routing is explicit, canonical and health-checked without weakening public-route verification.');"
    },
    {
      "path": "scripts/repair-buildfix46-source.mjs",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix46-source.mjs",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix46-source.mjs",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sw.includes('texise-app-shell-r14-28-20-buildfix46-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix47-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix48-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix49-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix50-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || sw."
    },
    {
      "path": "scripts/repair-buildfix46-source.mjs",
      "line": 36,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.20 Build Fix 46') && install.includes('repair-buildfix46-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 47') && install.includes('repair-buildfix47-source.mjs')) || (((install.includes('Installing TeXise R14.28.20 Build Fix 48') && install.includes('repair-buildfix48-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 49') && install.includes('repair-buildfix49-source.mjs')) || (((install"
    },
    {
      "path": "scripts/repair-buildfix46-source.mjs",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(hero.includes('texise-home-hero-v2') && hero.includes('TeXise — Privacy First Research'), 'BF50 restored homepage hero is missing');"
    },
    {
      "path": "scripts/repair-buildfix46-source.mjs",
      "line": 41,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(app.includes('<HomePowerFeatures />') && app.includes('<HomeWorkflowsShowcase />') && app.includes('<HomeProductComparison />') && !app.includes('<HomeFeatureShowcase />'), 'BF50 public homepage must preserve the approved BF46 workflow layout with real TeXise content');"
    },
    {
      "path": "scripts/repair-buildfix46-source.mjs",
      "line": 42,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(marketing.includes('Power Features') && marketing.includes('TeXise vs Overleaf'), 'BF50 replacement public marketing sections are incomplete');"
    },
    {
      "path": "scripts/repair-buildfix46-source.mjs",
      "line": 43,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-why-card') && css.includes('.texise-home-workflow-card') && css.includes('.texise-product-comparison'), 'BF50 restored public marketing styling is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix46-source.mjs",
      "line": 51,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((app.includes('texise-template-pdf-preview') || app.includes('TemplatePdfPreview')) && app.includes('Upload PNG, JPEG, WebP or PDF (up to 20 MB)'), 'template public/Admin preview UI is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix46-source.mjs",
      "line": 65,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 46 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix46-source.mjs",
      "line": 69,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 46 source guard: BF45 production routing and template preview image/PDF upload with automatic PDF fallback remain verified under the BF50 public-site redesign.');"
    },
    {
      "path": "scripts/repair-buildfix47-source.mjs",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix47-source.mjs",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix47-source.mjs",
      "line": 21,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('texise-templates/templates.json'),"
    },
    {
      "path": "scripts/repair-buildfix47-source.mjs",
      "line": 22,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('texise-templates/institutions.json'),"
    },
    {
      "path": "scripts/repair-buildfix47-source.mjs",
      "line": 31,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((sw.includes('texise-app-shell-r14-28-20-buildfix47-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix48-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix49-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix50-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || sw.includes('texise-app-shell-r14-28-20-buildfix51-4-v1'))))))"
    },
    {
      "path": "scripts/repair-buildfix47-source.mjs",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.20 Build Fix 47') && install.includes('repair-buildfix47-source.mjs')) || (((install.includes('Installing TeXise R14.28.20 Build Fix 48') && install.includes('repair-buildfix48-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 49') && install.includes('repair-buildfix49-source.mjs')) || (((install.includes('Installing TeXise R14.28.20 Build Fix 50') && install.includes('repair-buildfix50-source.mjs')) || (install."
    },
    {
      "path": "scripts/repair-buildfix47-source.mjs",
      "line": 38,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "// texise-templates is the live filesystem-backed catalog in production. Admins can"
    },
    {
      "path": "scripts/repair-buildfix47-source.mjs",
      "line": 46,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "requireSource(demos.every((item) => item.provenance === 'texise'), 'BF47 remaining demo templates must stay clearly labelled TeXise-created records');"
    },
    {
      "path": "scripts/repair-buildfix47-source.mjs",
      "line": 50,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "for (const token of ['.texise-template-category-grid', '.texise-template-browser', '.texise-template-quick-dialog', '.texise-template-institution-strip']) requireSource(css.includes(token), `BF47 template directory styling missing ${token}`);"
    },
    {
      "path": "scripts/repair-buildfix47-source.mjs",
      "line": 58,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 47 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix47-source.mjs",
      "line": 62,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 47 source guard: BF46 preview/homepage foundation preserved; mutable runtime template catalog shape/safety, institution-first navigation, category CollectionPages, faceted browsing and Quick Preview verified.');"
    },
    {
      "path": "scripts/repair-buildfix48-source.mjs",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix48-source.mjs",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix48-source.mjs",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((sw.includes('texise-app-shell-r14-28-20-buildfix48-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix49-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix50-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || sw.includes('texise-app-shell-r14-28-20-buildfix51-4-v1'))))))), 'BF48 app-shell cache identity is missing');"
    },
    {
      "path": "scripts/repair-buildfix48-source.mjs",
      "line": 34,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(((install.includes('Installing TeXise R14.28.20 Build Fix 48') && install.includes('repair-buildfix48-source.mjs')) || ((install.includes('Installing TeXise R14.28.20 Build Fix 49') && install.includes('repair-buildfix49-source.mjs')) || (((install.includes('Installing TeXise R14.28.20 Build Fix 50') && install.includes('repair-buildfix50-source.mjs')) || (install.includes('Installing TeXise R14.28.20 Build Fix 51') && install.includes('repair-buildfix51-source.mjs')))))), 'install"
    },
    {
      "path": "scripts/repair-buildfix48-source.mjs",
      "line": 41,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-admin-institution-logo'), 'BF48 institution logo styling is missing');"
    },
    {
      "path": "scripts/repair-buildfix48-source.mjs",
      "line": 56,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 48 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix48-source.mjs",
      "line": 60,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 48 source guard: BF47 template directory preserved; institution logos, paginated catalog, atomic template preflight, Firefox prompt suppression and template chooser scaling verified.');"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 25,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('texise-templates/categories.json'),"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 37,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts'),"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 50,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((sw.includes('texise-app-shell-r14-28-20-buildfix49-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix50-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || sw.includes('texise-app-shell-r14-28-20-buildfix51-4-v1')))))), 'BF49 app-shell cache identity is missing');"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 51,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource((install.includes('Installing TeXise R14.28.20 Build Fix 49') && install.includes('repair-buildfix49-source.mjs')) || (((install.includes('Installing TeXise R14.28.20 Build Fix 50') && install.includes('repair-buildfix50-source.mjs')) || (install.includes('Installing TeXise R14.28.20 Build Fix 51') && install.includes('repair-buildfix51-source.mjs')))), 'installer does not identify/enforce BF49-or-later');"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 53,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(deploy.includes('texise-templates/categories.json') && deploy.includes(\"texise_frontend_request '/texise-templates/categories.json'\"), 'deployment does not require/health-check the managed template category registry');"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 54,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(apache.includes('<Location \"/texise-templates/categories.json\">') && apache.includes('no-cache, no-store, must-revalidate'), 'Apache does not revalidate the mutable public template category registry');"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 78,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(pdfViewer.includes('className=\"texise-template-pdfjs-toolbar\" role=\"toolbar\" aria-label=\"PDF preview controls\"'), 'Hotfix10 PDF preview toolbar accessibility semantics are incomplete');"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 82,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(iconRenderer.includes('/texise-icons/lucide/') && !iconRenderer.includes('dynamicIconImports'), 'Hotfix10 public category icons must use static SVG assets instead of a runtime Lucide registry');"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 85,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(!iconBrowser.includes('dynamicIconImports') && !iconBrowser.includes('React.lazy') && iconBrowser.includes('/texise-icons/lucide-category-icons.json') && iconBrowser.includes('/texise-icons/lucide-category-icons.svg') && iconBrowser.includes('const PAGE_SIZE = 96') && !iconBrowser.includes('iconCache'), 'Hotfix10 Admin Lucide browser must use bounded build-generated static SVG assets without retaining per-icon React modules');"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 86,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(deploy.includes('texise-icons/lucide-category-icons.json') && deploy.includes('texise-icons/lucide/file-text.svg'), 'Hotfix10 deployment does not require/health-check static Lucide category assets');"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 97,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(nativeVisual.includes(\"'texise-visual-protected-clickable'\") && nativeVisual.includes(\"role: 'button'\") && nativeVisual.includes(\"'Open in Source →'\") && nativeVisual.includes(\"node.type.name === RAW_INLINE || node.type.name === RAW_BLOCK\") && nativeVisual.includes(\"event.key === 'Enter' || event.key === ' '\"), 'Hotfix10 protected Visual LaTeX must be an accessible whole-box Source navigation surface');"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 107,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 49 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix49-source.mjs",
      "line": 111,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 49 source guard: BF48 template UX reliability preserved; strict pagination gap calculation is safe under noUncheckedIndexedAccess.');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 15,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 32,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('deploy/config/texise.env.example'),"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 40,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('deploy/systemd/texise.service'),"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 67,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('texise-services/cloud-compile/server.js'),"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 73,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((sw.includes('texise-app-shell-r14-28-20-buildfix50-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || sw.includes('texise-app-shell-r14-28-20-buildfix51-4-v1'))))), 'BF50 app-shell cache identity is missing');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 74,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(((install.includes('Installing TeXise R14.28.20 Build Fix 50') && install.includes('repair-buildfix50-source.mjs')) || (install.includes('Installing TeXise R14.28.20 Build Fix 51') && install.includes('repair-buildfix51-source.mjs'))), 'installer does not identify/enforce BF50');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 79,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(!app.includes('<HomeFeatureShowcase />') && app.includes('<HomeWorkflowsShowcase />'), 'BF50 must render the approved Explore TeXise workflow section without the superseded Built Awesome component');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 82,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(marketing.includes('Everything you need to write LaTeX') && marketing.includes('Power Features') && marketing.includes('Switching from Overleaf?') && marketing.includes('TeXise vs Overleaf'), 'BF50 Features/home marketing content is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 84,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(marketing.includes('texise-features-card-grid') && marketing.includes('texise-feature-card-v2') && marketing.includes('CircleCheckBig') && marketing.includes('Tools for the whole LaTeX workflow'), 'BF50.2 card-based Features page is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 85,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "requireSource(workflows.includes('TeXiser helps researchers shape ideas into polished scientific documents') && workflows.includes('texise-home-workflow-secondary texise-home-workflow-capabilities'), 'BF50.3 concise TeXiser homepage copy/styling is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 86,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('@media (min-width: 1070px) and (min-height: 851px)') && css.includes('justify-content: center;') && css.includes('.texise-product-comparison .texise-section-heading > h2') && css.includes('.texise-features-card-grid'), 'BF50.2 desktop hero/comparison/Features styling is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 87,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(app.includes('title=\"A mindful pricing.\"') && css.includes('Build Fix 50.3 — Explore TeXise copy rhythm') && css.includes('padding-bottom: clamp(2.25rem, 4.5vw, 3.5rem)') && css.includes('font-size: clamp(2rem, 4vw, 3rem)'), 'BF50.3 pricing heading/workflow typography/comparison spacing refinement is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 88,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(workflows.includes('Explore TeXise') && workflows.includes('Meet TeXiser') && workflows.includes('TeXise Lab') && workflows.includes('TeXise Research') && workflows.includes('TeXise Editor') && workflows.includes('/texiser.webp') && workflows.includes('/texise-lab.webp') && workflows.includes('/texise-research.webp') && workflows.includes('/texise-editor.webp'), 'BF50 Explore TeXise workflow content/artwork wiring is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 89,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const artworkFiles = ['texiser.webp', 'texise-lab.webp', 'texise-research.webp', 'texise-editor.webp'];"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 91,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(artworkPresent.every(Boolean), 'BF50 Explore TeXise public WebP artwork files are missing');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 94,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(marketing.includes('PDF export — TeXise watermark') && marketing.includes('PDF export — no watermark'), 'BF50 public PDF entitlement copy is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 98,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(hero.includes('texise-home-hero-v2') && hero.includes('TeXise — Privacy First Research') && hero.includes('<HeroWorkspacePreview />') && hero.includes('Buy Pro $29'), 'BF50 restored interactive hero is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 99,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-home-hero-v2') && css.includes('.texise-why-card') && css.includes('.texise-home-workflow-card') && css.includes('.texise-compare-check') && css.includes('.texise-final-cta h2'), 'BF50 restored public responsive/CTA styling is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 101,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(app.includes(\"pathname === '/about'\") && app.includes('<AboutPage />') && app.includes('/texise-team.webp') && app.includes('LaTeX research writing') && app.includes('TeXise Team') && app.includes('Portable by design'), 'BF50 About mission/team page and supplied team artwork wiring are incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 102,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "requireSource(app.includes(\"pathname === '/apply'\") && app.includes('<ApplyLicensePage />') && app.includes('texise-apply-license-blurred') && app.includes('Login') && app.includes('eligible 10-digit activation codes'), 'BF50 unified login-gated /apply license page is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 104,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('.texise-about-team-image') && css.includes('.texise-about-page :is(h1, h2, h3)') && css.includes('.texise-about-contact .texise-button') && css.includes('font-family: var(--texise-font-display)') && css.includes('.texise-apply-login-button') && css.includes('background: var(--texise-yellow)'), 'BF50 About/apply responsive, Moranga and yellow-login styling is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 106,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const teamArtworkPresent = await access(resolve(root, 'packages/tooling/browser-entry/public/texise-team.webp')).then(() => true).catch(() => false);"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 107,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(teamArtworkPresent, 'BF50 supplied texise-team.webp About artwork is missing');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 114,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(config.includes('PAYHIP_MONTHLY_PRODUCT_SECRET_KEY') && config.includes('TEXISE_PRO_MONTHLY_PRODUCT_SECRET_KEY') && config.includes('PAYHIP_MONTHLY_PRODUCT_LINK') && config.includes('TEXISE_PRO_MONTHLY_SHOP') && envExample.includes('PAYHIP_MONTHLY_PRODUCT_SECRET_KEY=') && envExample.includes('TEXISE_PRO_MONTHLY_SHOP='), 'BF50 separate Monthly Payhip product configuration is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 116,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(router.includes('await chmod(temporaryPath, 0o644)') && deploy.includes('-exec chmod 0644 {} +') && deploy.includes('--property=UMask=0027'), 'BF50 public Blog media must be Apache-readable under the texise.service UMask and existing 0640 covers must be repaired');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 125,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "requireSource(deploy.includes('TEXISE_TEMPLATE_ROOT=\"${TEXISE_TEMPLATE_ROOT:-${TEXISE_SITE_ROOT}/templates}\"') && deploy.includes('texise_prepare_persistent_template_library()') && deploy.includes('texise_sync_persistent_template_source_mirror()'), 'BF50.7 deployment does not use /var/www/texise.com/templates as the persistent authoritative template library');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 126,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(deploy.includes('cp -a --no-clobber') && deploy.includes('.texise-template-library-initialized') && deploy.includes('legacy_config_root=\"${TEXISE_SITE_ROOT}/template-config\"'), 'BF50.7 first-run template migration/seed protection is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 129,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "requireSource(!templateLibrary.includes('TEXISE_TEMPLATE_CONFIG_ROOT') && !templateLibrary.includes('mirrorPersistentAdminConfig') && systemdUnit.includes('/var/www/texise.com/templates') && !systemdUnit.includes('/var/www/texise.com/template-config'), 'BF50.7 Admin writes must target the full persistent template library directly');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 130,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(templateLibrary.includes('Complex projects may legitimately have several candidate .tex files.') && templateLibrary.includes(\"mkdtemp(path.join(root, '.texise-delete-'))\") && templateLibrary.includes(\"throw templateError('template_entry_file_required', 422)\"), 'BF50.10 complex template draft upload / same-filesystem permanent delete hardening is missing');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 135,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(css.includes('Build Fix 50.5 — comparison hub/detail pages') && css.includes('margin-bottom: .95rem;') && css.includes('.texise-compare-detail-table'), 'BF50.5 comparison page styling/heading rhythm is missing');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 136,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(lucideGenerator.includes('<title>${title}</title>') && lucideGenerator.includes('TeXise Lucide category icon sprite'), 'BF50.5 generated Lucide SVG accessibility titles are missing');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 137,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(deploy.includes('node scripts/generate-lucide-category-assets.mjs') && deploy.indexOf('node scripts/generate-lucide-category-assets.mjs') < deploy.indexOf('texise_pnpm run lint:ci'), 'BF50.5 deployment must refresh generated Lucide SVGs before Biome lint');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 142,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(deploy.includes('texise_is_http_url') && deploy.includes('repaired TEXISE_BUSY_TEXLIVE_ENDPOINT') && compilerStatusGenerator.includes('configuredHttpEndpoint'), 'BF50.13 Full compiler endpoint validation must self-heal malformed preserved endpoint values.');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 144,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(config.includes('TEXISE_CLOUD_COMPILE_FREE_FALLBACK') && cloudBroker.includes('Product access is universal') && cloudBroker.includes('principal: `browser:${fallbackClientId(fallbackClient)}`') && cloudBroker.includes('fallback && !config.freeFallbackEnabled') && entitlement.includes('fallbackClientId: cloudFallbackClientId()'), 'BF50.12 universal Cloud Compile / reliability-fallback authorization and accounting are incomplete.');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 146,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(compilePanel.includes('Cloud Compile uses TeXise’s isolated Docker TeX Live environment.') && compilePanel.includes('Docker TeX Live Full is active for this project.') && compilePanel.includes('Retry browser compiler') && texliveFallbackRegression.includes('compiler settings retain compact Cloud Compile and Full TeX Live fallback disclosure'), 'BF50.12 compiler fallback disclosure/regression source is incomplete.');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 148,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "requireSource(cloudWorker.includes('normalizeContainerReadableProjectTree') && cloudWorker.includes('await chmod(root, 0o755)') && cloudWorker.includes('await chmod(target, 0o644)') && cloudWorker.includes(\"'--user', '65534:65534'\") && deploy.includes('TEXISE_CLOUD_COMPILE_FREE_FALLBACK') && deploy.includes('check-cloud-compile-worker.mjs'), 'BF50.16 Docker Cloud Compile source-tree permissions / fallback-only certification hardening is incomplete.');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 165,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "bf50LiveCompiler.includes('__texise_live_instant__.tex') &&"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 166,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "bf50LiveCompiler.includes('__texise_live_instant_warm__.tex') &&"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 176,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Build Fix 50 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix50-source.mjs",
      "line": 181,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Build Fix 50 source guard: BF49 recovery preserved; restored hero, Power Features, Explore TeXise, comparison pages, accessible Lucide assets, pricing truth, FAQ, entitlements, export policy, the full persistent Admin-authoritative template library, Full TeX Live coverage, self-healing full-tree endpoints and Free Docker reliability fallback, generic sticky per-project Cloud Live PDF routing, unprivileged Docker source readability, artifact-based Biber certification, print-"
    },
    {
      "path": "scripts/repair-buildfix51-1-source.mjs",
      "line": 31,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix51-1-source.mjs",
      "line": 32,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix51-1-source.mjs",
      "line": 57,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((sw.includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || sw.includes('texise-app-shell-r14-28-20-buildfix51-4-v1'))), 'BF51.1 service-worker cache identity is missing');"
    },
    {
      "path": "scripts/repair-buildfix51-1-source.mjs",
      "line": 73,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(productionSeo.includes('comparisonRoutes') && productionSeo.includes('data-texise-prerender') && productionSeo.includes('/docs/ollama'), 'production SEO verification does not cover the complete canonical comparison surface and Ollama docs');"
    },
    {
      "path": "scripts/repair-buildfix51-1-source.mjs",
      "line": 79,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] BF51.1 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix51-1-source.mjs",
      "line": 84,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] BF51.1 source guard: verified-local Ollama privacy, generic LaTeX AI recovery, viewer-aware R6 diagnostics/lifecycle, deep sourced comparisons and substantive initial comparison HTML verified over the complete BF51 foundation.');"
    },
    {
      "path": "scripts/repair-buildfix51-2-source.mjs",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix51-2-source.mjs",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(docs.includes('version: 22') && docs.includes('bf51_2_texposit_style_ollama_workflow_docs') && docs.includes('ollama create texise-academic'), 'BF51.2 Ollama documentation migration is missing');"
    },
    {
      "path": "scripts/repair-buildfix51-2-source.mjs",
      "line": 36,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((sw.includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (sw.includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || sw.includes('texise-app-shell-r14-28-20-buildfix51-4-v1'))), 'BF51.2 service-worker cache identity is stale');"
    },
    {
      "path": "scripts/repair-buildfix51-2-source.mjs",
      "line": 43,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] BF51.2 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix51-2-source.mjs",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] BF51.2 source guard: user-side Ollama selection/discovery, model selection, BYOK fallback, privacy boundary and documentation verified over BF51.1.');"
    },
    {
      "path": "scripts/repair-buildfix51-3-source.mjs",
      "line": 31,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix51-3-source.mjs",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix51-3-source.mjs",
      "line": 44,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource((sw.includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || sw.includes('texise-app-shell-r14-28-20-buildfix51-4-v1')), 'BF51.3 service-worker cache identity is stale');"
    },
    {
      "path": "scripts/repair-buildfix51-3-source.mjs",
      "line": 50,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] BF51.3 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix51-3-source.mjs",
      "line": 55,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "console.log('[TeXise] BF51.3 source guard: Ollama local/cloud selection, Privacy Mode boundary, review provenance, docs, comparison disclosure and cumulative release wiring verified.');"
    },
    {
      "path": "scripts/repair-buildfix51-4-source.mjs",
      "line": 32,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js'),"
    },
    {
      "path": "scripts/repair-buildfix51-4-source.mjs",
      "line": 34,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix51-4-source.mjs",
      "line": 47,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(seo.includes('renderChangeLogPrerender') && seo.includes('texise-page-container texise-change-log-page') && seo.includes('texise-change-log-timeline') && seo.includes('data-texise-prerender-shell') && seo.includes('data-texise-prerender-shell hidden aria-hidden=\"true\"') && !seo.includes('texise-prerender-visibility') && !saasCss.includes('texise-prerender-visibility') && index.includes(\"'/change-log'\"), 'BF51.4 Change log SEO/sitemap/FOUC-safe prerender wiring is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix51-4-source.mjs",
      "line": 48,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(sw.includes('texise-app-shell-r14-28-20-buildfix51-4-v1'), 'BF51.4 app-shell cache identity is stale');"
    },
    {
      "path": "scripts/repair-buildfix51-4-source.mjs",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const pricingPlansSource = marketing.slice(marketing.indexOf('export const TEXISE_PRICING_PLANS'), marketing.indexOf('export const TEXISE_PLAN_COMPARISON'));"
    },
    {
      "path": "scripts/repair-buildfix51-4-source.mjs",
      "line": 61,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] BF51.4 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix51-4-source.mjs",
      "line": 65,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "console.log('[TeXise] BF51.4 source guard: database-backed public Change log, styled initial HTML, dated Admin events, on-demand Ollama localhost access, legacy /ws welcome-to-home routing, footer/SEO/sitemap and cumulative release wiring verified.');"
    },
    {
      "path": "scripts/repair-buildfix51-source.mjs",
      "line": 19,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "scripts/repair-buildfix51-source.mjs",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf'),"
    },
    {
      "path": "scripts/repair-buildfix51-source.mjs",
      "line": 56,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "requireSource(migrations.includes('Using Ollama with TeXise') && migrations.includes('OLLAMA_ORIGINS=https://www.texise.com'), 'BF51 Ollama documentation migration is missing');"
    },
    {
      "path": "scripts/repair-buildfix51-source.mjs",
      "line": 58,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "requireSource(deploy.includes('bingbot/2.0') && deploy.includes('texise_indexnow_key_health_check') && deploy.includes('IndexNow notification failed after a healthy deployment; continuing without rollback.'), 'BF51 Bing/favicon/IndexNow deployment hardening is incomplete');"
    },
    {
      "path": "scripts/repair-buildfix51-source.mjs",
      "line": 81,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] BF51 source guard failed:');"
    },
    {
      "path": "scripts/repair-buildfix51-source.mjs",
      "line": 86,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] BF51 source guard: canonical comparison evidence, Bing/favicon + IndexNow hardening, Local AI/Ollama/BYOK AI routing, bounded structured AI recovery and local-only R6 diagnostics verified over the complete BF50 foundation.');"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 17,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "integratedGate: 'R14.28.20 BF51.1 production privacy, AI, PDF and search hardening + R14.28.20 BF51 growth, Ollama, comparison and search hardening + R14.28.20 BF50 public-site redesign + R14.28.12 scientific runtime doctor/live certification + R14.28.11 research workflow automation + R14.28.10 bounded terminal Agent mode + R14.28.9 certified WASI utilities + R14.28.8 C/C++ WASIX + R14.28.7 Git/HTTP + R14.28.6 results workspace + R14.28.5 scientific AI + R14.28.4 webR + R14.28.3 Pyodide + R14.28"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 71,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_COMPILER_PROFILE: 'full',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 232,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Unable to resolve pnpm for release certification. Run \"corepack enable\" and retry.');"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 235,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Release quality will invoke pnpm via ${pnpm.source}.`);"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 246,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['static-contract-audit', ['run', 'texise:contract-audit']],"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 255,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const scientificRuntimeLive = process.env.TEXISE_SCIENTIFIC_RUNTIME_LIVE === '1';"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 256,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const scientificCppLive = scientificRuntimeLive && process.env.TEXISE_C_CPP_LIVE === '1';"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 271,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "product: 'TeXise',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 289,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": ": 'R14.28.12 live Python/R runtime gate not requested; set TEXISE_SCIENTIFIC_RUNTIME_LIVE=1 to require external-runtime certification',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 292,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": ": 'R14.28.12 live C/C++/WASI gate not requested; set TEXISE_C_CPP_LIVE=1 together with TEXISE_SCIENTIFIC_RUNTIME_LIVE=1 to require it',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 301,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'TeXise production Microsoft Edge Playwright suite',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 302,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'TeXise production Chromium Playwright suite',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 303,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'TeXise production Firefox Playwright suite',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 304,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'TeXise production desktop WebKit/Safari-equivalent Playwright suite',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 328,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.26.2 source IDs validated by TeXise with fabricated evidence markers rejected',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 342,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.13 native TeXise Visual interactions',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 347,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.18 controller-backed Source/Visual canonical session, exact Visual splices, unified TeXise MathLive and native slash reliability',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 349,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.16 TeXise Source editor, stable soft wrap, minimal canonical transactions and passive reveal caret stability',"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 366,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] Release certification written for ${release.releaseId}.`);"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 392,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('[TeXise] Unable to finalize release certification.', error);"
    },
    {
      "path": "scripts/run-release-quality.mjs",
      "line": 395,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] R14.28.12 integrated browser certification passed; Python/R live gate: ${scientificRuntimeLive ? 'passed' : 'not-run'}, C/C++/WASI live gate: ${scientificCppLive ? 'passed' : 'not-run'}.`);"
    },
    {
      "path": "scripts/source-syntax-highlighting-regression.test.mjs",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(editor, /syntaxHighlighting\\(texiseSourceHighlightStyle\\)/u);"
    },
    {
      "path": "scripts/source-syntax-highlighting-regression.test.mjs",
      "line": 25,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('light and dark TeXise themes define readable source syntax palettes', () => {"
    },
    {
      "path": "scripts/source-syntax-highlighting-regression.test.mjs",
      "line": 26,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const css = read('packages/tooling/browser-entry/src/texise-design.css');"
    },
    {
      "path": "scripts/source-syntax-highlighting-regression.test.mjs",
      "line": 28,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-syntax-keyword',"
    },
    {
      "path": "scripts/source-syntax-highlighting-regression.test.mjs",
      "line": 29,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-syntax-command',"
    },
    {
      "path": "scripts/source-syntax-highlighting-regression.test.mjs",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-syntax-type',"
    },
    {
      "path": "scripts/source-syntax-highlighting-regression.test.mjs",
      "line": 31,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-syntax-property',"
    },
    {
      "path": "scripts/source-syntax-highlighting-regression.test.mjs",
      "line": 32,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-syntax-name',"
    },
    {
      "path": "scripts/source-syntax-highlighting-regression.test.mjs",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-syntax-string',"
    },
    {
      "path": "scripts/source-syntax-highlighting-regression.test.mjs",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-syntax-number',"
    },
    {
      "path": "scripts/source-syntax-highlighting-regression.test.mjs",
      "line": 35,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'--texise-syntax-comment',"
    },
    {
      "path": "scripts/submit-indexnow.mjs",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const key = String(process.env.TEXISE_INDEXNOW_KEY || '').trim();"
    },
    {
      "path": "scripts/submit-indexnow.mjs",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const publicUrl = String(process.env.TEXISE_PUBLIC_URL || 'https://www.texise.com').trim().replace(/\\/+$/u, '');"
    },
    {
      "path": "scripts/submit-indexnow.mjs",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] IndexNow: key not configured; skipping notification.');"
    },
    {
      "path": "scripts/submit-indexnow.mjs",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "throw new Error('TEXISE_INDEXNOW_KEY must be 8-128 letters, numbers or hyphens.');"
    },
    {
      "path": "scripts/submit-indexnow.mjs",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const changedUrlsFile = String(process.env.TEXISE_INDEXNOW_URLS_FILE || '').trim();"
    },
    {
      "path": "scripts/submit-indexnow.mjs",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise] IndexNow accepted ${urlList.length} changed canonical URLs (HTTP ${response.status}).`);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const deployLib = join(process.cwd(), 'scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(join(tmpdir(), 'texise-saas-config-'));"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 19,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const file = join(dir, 'texise.env');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const file = await envFile('TEXISE_SAAS_ENABLED=0\\nMYSQL_DATABASE=texisecom_db\\nTEXISE_MYSQL_CREATE_DATABASE=0\\n');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 26,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const result = runBash(`if texise_saas_requested ${JSON.stringify(file)}; then echo requested; else echo disabled; fi`);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const file = await envFile('TEXISE_SAAS_ENABLED=0\\nMYSQL_HOST=127.0.0.1\\nMYSQL_DATABASE=texisecom_db\\nTEXISE_MYSQL_CREATE_DATABASE=0\\nSESSION_SECRET=' + 'x'.repeat(48) + '\\n');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 33,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const result = runBash(`texise_prepare_and_validate_saas_config ${JSON.stringify(file)}`);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 41,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_SAAS_ENABLED=1',"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 43,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'MYSQL_DATABASE=texisecom_db',"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 44,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'MYSQL_USER=texise',"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 46,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_MYSQL_CREATE_DATABASE=0',"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 51,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const result = runBash(`texise_prepare_and_validate_saas_config ${JSON.stringify(file)}`);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const invalid = await envFile('TEXISE_SAAS_ENABLED=1\\nMYSQL_HOST=db\\nMYSQL_USER=u\\nMYSQL_PASSWORD=p\\nTEXISE_MYSQL_CREATE_DATABASE=yes\\nSESSION_SECRET=' + 'z'.repeat(48) + '\\n');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 58,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const invalidResult = runBash(`texise_prepare_and_validate_saas_config ${JSON.stringify(invalid)}`);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 62,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const flagOnly = await envFile('TEXISE_SAAS_ENABLED=0\\nTEXISE_MYSQL_CREATE_DATABASE=1\\n');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const detection = runBash(`if texise_saas_requested ${JSON.stringify(flagOnly)}; then echo requested; else echo disabled; fi`);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 69,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "const file = await envFile('TEXISE_AI_REVIEW_AUDIT_DB=/etc/texise/ai-review-audit.sqlite3\\n');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 70,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "const result = runBash(`texise_migrate_env_known_default ${JSON.stringify(file)} TEXISE_AI_REVIEW_AUDIT_DB /etc/texise/ai-review-audit.sqlite3 /var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3`);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 72,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(await readFile(file, 'utf8'), /^TEXISE_AI_REVIEW_AUDIT_DB=\\/var\\/www\\/texise\\.com\\/public_html\\/texise-data\\/audit\\/ai-review-audit\\.sqlite3$/mu);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(join(tmpdir(), 'texise-audit-db-migrate-'));"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 78,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dataDir = join(dir, 'public_html', 'texise-data');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 81,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const blogMediaRoot = join(dir, 'public_html', 'texise-media');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 87,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "await writeFile(join(configDir, 'texise.env'), `TEXISE_AI_REVIEW_AUDIT_DB=${join(auditDir, 'ai-review-audit.sqlite3')}\\n`, 'utf8');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 90,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONFIG_DIR=${JSON.stringify(configDir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 91,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DATA_DIR=${JSON.stringify(dataDir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 92,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_AUDIT_DIR=${JSON.stringify(auditDir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 93,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_LEGACY_DATA_DIR=${JSON.stringify(legacyDir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 94,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_BLOG_MEDIA_ROOT=${JSON.stringify(blogMediaRoot)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 95,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_BLOG_MEDIA_DIR=${JSON.stringify(join(blogMediaRoot, 'blog'))}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 96,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_LEGACY_BLOG_MEDIA_ROOT=${JSON.stringify(legacyBlogRoot)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 101,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_legacy_server_storage"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 108,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(join(tmpdir(), 'texise-entitlement-perms-'));"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 121,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONFIG_DIR=${JSON.stringify(dir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 123,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "texise_install_signing_keys"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 138,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "test('final config normalization fixes the exact legacy /etc/texise modes without touching unknown files', async () => {"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 139,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(join(tmpdir(), 'texise-config-normalize-'));"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 142,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'texise.env',"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 158,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONFIG_DIR=${JSON.stringify(dir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 161,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "stat(){ if [[ \"$1\" == \"-c\" && \"$2\" == \"%U:%G\" ]]; then printf 'root:texise\\n'; else command stat \"$@\"; fi; }"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 162,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "texise_normalize_config_permissions"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 175,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(join(tmpdir(), 'texise-saas-preflight-'));"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 181,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "await writeFile(join(configDir, 'texise.env'), ["
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 182,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_SAAS_ENABLED=1',"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 184,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'MYSQL_DATABASE=texise_db',"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 185,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'MYSQL_USER=texise_app',"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 193,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONFIG_DIR=${JSON.stringify(configDir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 194,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "texise_require_command(){ return 0; }"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 196,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "texise_saas_preflight_runtime ${JSON.stringify(runtime)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 200,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(result.stdout, /EnvironmentFile=.*texise\\.env/u);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 205,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(join(tmpdir(), 'texise-template-namespace-'));"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 207,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const canonicalRoot = join(dir, 'texise-templates');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 208,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const canonicalPublic = join(dir, 'packages/tooling/browser-entry/public/texise-templates');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 219,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SOURCE_ROOT=${JSON.stringify(dir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 220,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_migrate_legacy_template_namespace"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 231,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(join(tmpdir(), 'texise-browser-fonts-'));"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 249,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "await writeFile(join(configDir, 'texise.env'), `TEXISE_FONT_SOURCE_DIR=${sourceDir}\\n`, 'utf8');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 252,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONFIG_DIR=${JSON.stringify(configDir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 253,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DIST_DIR=${JSON.stringify(distDir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 254,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "texise_install_browser_fonts"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 257,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(result.stdout, /all 8 TeXise browser fonts/u);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 258,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const targetDir = join(distDir, 'texise-fonts');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 276,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(join(tmpdir(), 'texise-browser-font-invalid-'));"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 294,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "await writeFile(join(configDir, 'texise.env'), `TEXISE_FONT_SOURCE_DIR=${sourceDir}\\n`, 'utf8');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 297,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONFIG_DIR=${JSON.stringify(configDir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 298,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DIST_DIR=${JSON.stringify(distDir)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 299,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "texise_install_browser_fonts"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 306,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(join(tmpdir(), 'texise-media-health-'));"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 307,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const stageRoot = join(dir, 'texise-media');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 308,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const publishedRoot = join(dir, 'dist', 'texise-media');"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 317,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_MEDIA_STAGE_ROOT=${JSON.stringify(stageRoot)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 318,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_MEDIA_PUBLISHED_ROOT=${JSON.stringify(publishedRoot)}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 319,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_BLOG_MEDIA_DIR=${JSON.stringify(join(stageRoot, 'blog'))}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 320,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_DOCS_MEDIA_DIR=${JSON.stringify(join(stageRoot, 'docs'))}"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 330,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "if [[ \"$url\" == *'/texise-data/runtime/probe' ]]; then"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 334,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "local relative=\"${'${url#*\\/texise-media\\/}'}\""
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 335,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "cat \"$TEXISE_MEDIA_PUBLISHED_ROOT/$relative\""
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 337,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "texise_blog_media_health_check"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 341,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(result.stdout, /Blog\\/Docs media staging, live projection, static serving and texise-data denial checks passed/u);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 347,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.deepEqual((await readdir(join(stageRoot, 'blog'))).filter((name) => name.includes('.texise-health-')), []);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 348,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.deepEqual((await readdir(join(stageRoot, 'docs'))).filter((name) => name.includes('.texise-health-')), []);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 349,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.deepEqual((await readdir(join(publishedRoot, 'blog'))).filter((name) => name.includes('.texise-health-')), []);"
    },
    {
      "path": "scripts/texise-deploy-saas-config.node.test.mjs",
      "line": 350,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.deepEqual((await readdir(join(publishedRoot, 'docs'))).filter((name) => name.includes('.texise-health-')), []);"
    },
    {
      "path": "scripts/texise-license",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "LICENSE_FILE=\"${TEXISE_LICENSE_KEYS_FILE:-/etc/texise/license-keys}\""
    },
    {
      "path": "scripts/texise-license",
      "line": 9,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "texise-license add <license-key>"
    },
    {
      "path": "scripts/texise-license",
      "line": 10,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "texise-license remove <license-key>"
    },
    {
      "path": "scripts/texise-license",
      "line": 11,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "texise-license list"
    },
    {
      "path": "scripts/texise-license",
      "line": 14,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "into /etc/texise/license-keys."
    },
    {
      "path": "scripts/texise-license",
      "line": 19,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "printf 'texise-license: %s\\n' \"$*\" >&2"
    },
    {
      "path": "scripts/texise-license",
      "line": 50,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "install -d -o root -g texise -m 0750 \"$(dirname \"${LICENSE_FILE}\")\""
    },
    {
      "path": "scripts/texise-license",
      "line": 52,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "chown root:texise \"${LICENSE_FILE}\""
    },
    {
      "path": "scripts/texise-license",
      "line": 60,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "printf 'Added TeXise Pro licence. Fingerprint: '"
    },
    {
      "path": "scripts/texise-license",
      "line": 74,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "chown root:texise \"${tmp}\""
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 160,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const workspaceImportPattern = /(?:from\\s*|import\\s*\\(|require\\s*\\()\\s*['\"](@texise\\/[^'\"/]+)['\"]/gu;"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 255,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('root package identity', packageJson.name === 'texise', `expected package name texise, got ${packageJson.name}`);"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 256,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('root homepage', packageJson.homepage === 'https://www.texise.com', `expected www.texise.com homepage, got ${packageJson.homepage}`);"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 272,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('production dist validates service worker', prepareDist.includes(\"'texise-texlive-sw.js'\"), 'root production dist must validate the service worker');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 273,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('production dist validates PWA icons', prepareDist.includes(\"'texise-icons/app-icon-192.png'\") && prepareDist.includes(\"'texise-icons/app-icon-512.png'\"), 'root production dist must validate manifest icons');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 286,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('README identity', readme.startsWith('# TeXise\\n'), 'README must identify TeXise');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 287,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('README production origin', readme.includes('https://www.texise.com'), 'README must document www.texise.com');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 289,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "const expectedDocumentRoot = 'DocumentRoot /var/www/texise.com/public_html/dist';"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 290,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "const expectedDirectory = '<Directory \"/var/www/texise.com/public_html/dist\">';"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 291,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const http = read('deploy/apache/texise.com-http.conf');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 292,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const https = read('deploy/apache/texise.com-https.conf');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 293,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const appRedirectHttp = read('deploy/apache/app.texise.com-redirect-http.conf');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 294,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const appRedirectHttps = read('deploy/apache/app.texise.com-redirect-https.conf');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 295,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('Apache HTTP canonical ServerName', http.includes('ServerName www.texise.com') && http.includes('ServerAlias texise.com'), 'HTTP canonical vhost must name www and alias bare texise.com');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 296,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('Apache HTTP one-hop redirect', http.includes('https://www.texise.com%{REQUEST_URI}') && !http.includes('https://texise.com%{REQUEST_URI}'), 'all HTTP traffic must redirect directly to canonical www HTTPS');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 297,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('Apache HTTPS canonical ServerName', https.includes('ServerName www.texise.com') && https.includes('ServerAlias texise.com'), 'HTTPS canonical vhost must name www and alias bare texise.com');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 298,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('Apache HTTPS bare-domain redirect', https.includes('RewriteCond %{HTTP_HOST} ^texise\\\\.com$ [NC]') && https.includes('https://www.texise.com%{REQUEST_URI}'), 'bare HTTPS host must redirect to www preserving path/query');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 301,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "check('Apache HTTPS source not document root', !https.includes('DocumentRoot /var/www/texise.com/public_html\\n'), 'Apache must not expose the source tree as DocumentRoot');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 306,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('Apache HTTPS collaboration live relay', https.includes('ProxyPass        /collab-live ws://127.0.0.1:3101/collab-live'), 'authoritative Yjs document and awareness relay must proxy to the private texise.service collaboration listener');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 308,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('Apache HTTPS server-rendered route fallback', https.includes('__texise/render/') && https.includes('[P,L,NE]'), 'extensionless routes must proxy through the trusted SEO renderer');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 309,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('Apache HTTPS service-worker cache policy', https.includes('texise-texlive-sw\\\\.js') && https.includes('no-cache, no-store, must-revalidate'), 'service worker/manifest must not be immutable cached');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 310,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('Apache HTTPS static immutable cache', https.includes('texise-icons') && https.includes('locales'), 'icons and locale browser assets should use the immutable static-asset cache policy');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 312,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "check('Apache private namespaces denied', https.includes('<Directory \"/var/www/texise.com/public_html/texise-data\">') && https.includes('<Directory \"/var/www/texise.com/public_html/texise-services\">') && https.includes('Require all denied'), 'private runtime/service source namespaces must be denied by Apache');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 315,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!https.includes('Alias /texise-media/') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 316,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "https.includes('^/texise-media/(?:blog|docs)/') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 317,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "https.includes('texise-media|texise-data|texise-services') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 319,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/prepare-production-dist.mjs').includes(\"path.join(path.dirname(root), 'texise-media')\"),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 322,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const blogDeployLib = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 323,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('Blog media Apache readability repair', blogDeployLib.includes('find \"${TEXISE_BLOG_MEDIA_DIR}\" -maxdepth 1 -type f') && blogDeployLib.includes('-exec chmod 0644 {} +') && blogDeployLib.includes('--property=UMask=0027') && blogDeployLib.includes('chmodSync(p,0o644)'), 'public Blog covers must remain Apache-readable under texise.service UMask=0027 and historical 0640 media must be repaired');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 324,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('CMS media deployment health probes staging and dist projection', blogDeployLib.includes('for kind in blog docs') && blogDeployLib.includes('published_probe_file=\"${TEXISE_MEDIA_PUBLISHED_ROOT}/${kind}/${probe_name}\"') && blogDeployLib.includes('\"${probe_file}\" \"${published_probe_file}\"') && blogDeployLib.includes('/texise-media/${kind}/${probe_name}'), 'deployment health must mirror Admin dual-write semantics: persistent staging plus immediately served dist projection');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 325,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('legacy app HTTP redirect-only vhost', appRedirectHttp.includes('ServerName app.texise.com') && appRedirectHttp.includes('https://www.texise.com%{REQUEST_URI}') && !appRedirectHttp.includes('DocumentRoot'), 'legacy app HTTP host must only redirect to www');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 326,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('legacy app HTTPS redirect-only vhost', appRedirectHttps.includes('ServerName app.texise.com') && appRedirectHttps.includes('__TEXISE_APP_CERT__') && appRedirectHttps.includes('https://www.texise.com%{REQUEST_URI}') && !appRedirectHttps.includes('DocumentRoot'), 'legacy app HTTPS host must only redirect using a discovered matching certificate');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 329,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const systemd = read('deploy/systemd/texise.service');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 332,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "systemd.includes('WorkingDirectory=/var/www/texise.com/public_html/texise-data/runtime/current/server'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 337,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "systemd.includes('ExecStart=/usr/bin/node /var/www/texise.com/public_html/texise-data/runtime/current/server/index.mjs') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 338,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "systemd.includes('EnvironmentFile=/var/www/texise.com/public_html/texise-data/runtime/current/release.env'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 341,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('systemd no legacy /opt path', !systemd.includes('/opt/texise'), 'systemd must not depend on the R12 /opt/texise release tree');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 343,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deployLib = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 344,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "check('deployment canonical site root', deployLib.includes('TEXISE_SITE_ROOT=\"${TEXISE_SITE_ROOT:-/var/www/texise.com}\"'), 'deployment library must use /var/www/texise.com');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 345,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('deployment install root', deployLib.includes('TEXISE_INSTALL_ROOT=\"${TEXISE_INSTALL_ROOT:-${TEXISE_SITE_ROOT}/public_html}\"'), 'deployment library must define public_html as the source/install root');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 346,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('deployment dist root', deployLib.includes('TEXISE_DIST_DIR=\"${TEXISE_DIST_DIR:-${TEXISE_INSTALL_ROOT}/dist}\"'), 'deployment library must use public_html/dist');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 347,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('deployment source location guard', deployLib.includes('texise_require_source_location()'), 'installer must validate the source is in the production source root');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 349,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('deployment pnpm build', deployLib.includes('texise_pnpm run build'), 'deployment must run pnpm run build');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 350,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('deployment production app environment', deployLib.includes('export TEXISE_APP_ENV=production'), 'self-hosted Apache builds must identify as production');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 351,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('deployment source permissions', deployLib.includes('texise_prepare_source_permissions()'), 'deployment must make the source API path readable by the unprivileged service');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 352,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('deployment no active /opt release tree', !deployLib.includes('TEXISE_INSTALL_ROOT:-/opt/texise'), 'deployment library must not use /opt/texise as an active release root');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('deployment server-rendered route health check', deployLib.includes(\"texise_frontend_request '/about'\"), 'post-deploy health must exercise a server-rendered public route');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 355,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('deployment static rollback', deployLib.includes('texise_restore_previous_dist()'), 'failed health checks should restore dist.previous when available');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 356,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('deployment strict frontend health', deployLib.includes(\"if ! texise_frontend_request '/'; then\") && deployLib.includes(\"if ! texise_frontend_request '/about'; then\"), 'frontend health must propagate failed curl requests');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 357,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('deployment PWA icon health', deployLib.includes(\"texise_frontend_request '/texise-icons/app-icon-192.png'\"), 'post-deploy health must verify the manifest icon is served by Apache');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 358,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('deployment legacy SSL vhost cleanup', deployLib.includes('app.texise.com-le-ssl.conf') && deployLib.includes('texise.com-le-ssl.conf'), 'installer must disable both legacy app-serving and legacy primary Certbot vhosts after installing canonical www routing');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 359,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('deployment Apache vhost diagnostics', deployLib.includes('texise_frontend_failure_diagnostics()') && deployLib.includes('apache2ctl -S'), 'failed frontend health checks must show active Apache virtual-host selection');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 360,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('deployment rollback preserves legacy app tree', deployLib.includes('Preserving /var/www/app.texise.com as rollback material') && !deployLib.includes('rm -rf /var/www/app.texise.com'), 'migration must preserve the legacy app tree');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 361,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('deployment keeps Console Gateway active and retires only unused legacy daemons after health', deployLib.includes('texise_retire_legacy_services()') && deployLib.includes('texise-collab.service texise-reverb.service') && !deployLib.includes('texise-console-gateway.service texise-collab.service texise-reverb.service') && deployLib.includes('systemctl enable texise-console-gateway.service'), 'Console Gateway must remain active while only Hocuspocus/Reverb retire through the post-health migra"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 363,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const gatewaySource = read('texise-services/console-gateway/server.js');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 365,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('deployment builds canonical Linux Terminal image locally', deployLib.includes('texise_ensure_console_image()') && deployLib.includes(\"if [[ \\\"${image}\\\" == 'texlive/texlive-console:pro' ]]\") && deployLib.includes('docker build') && consoleDockerfile.includes('ARG BASE_IMAGE=texlive/texlive:latest') && consoleDockerfile.includes('com.texise.image.schema=\\\"r14.28.14-bf12\\\"') && consoleScientificRequirements.includes('numpy==2.5.2') && consoleScientificRequirements.includes('sympy==1.14.0') "
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 368,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "check('installer source location validation', install.includes('texise_require_source_location'), 'installer must validate /var/www/texise.com/public_html source placement');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 369,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('installer dependencies', install.includes('texise_install_dependencies'), 'installer must install pinned PNPM dependencies');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 370,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('installer browser build', install.includes('texise_build_frontend'), 'installer must build the browser application');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 372,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('installer has no release activation', !install.includes('texise_install_frontend_release') && !install.includes('texise_install_server'), 'installer must not activate R12 symlink releases');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 375,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('upgrade source location validation', upgrade.includes('texise_require_source_location'), 'upgrade must run from the production source root');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 376,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('upgrade dependencies', upgrade.includes('texise_install_dependencies'), 'upgrade must refresh pinned PNPM dependencies');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 377,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('upgrade build in place', upgrade.includes('texise_build_frontend'), 'upgrade must rebuild root dist in place');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 380,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('uninstall preserves source', !uninstall.includes('rm -rf \"${TEXISE_INSTALL_ROOT}\"'), 'uninstall must never delete the source root');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 381,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('uninstall removes generated dist', uninstall.includes('\"${TEXISE_DIST_DIR}\"'), 'uninstall should remove generated static build artifacts');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 383,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const serviceWorker = read('packages/tooling/browser-entry/public/texise-texlive-sw.js');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 384,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('offline app cache', (serviceWorker.includes(\"const APP_CACHE = 'texise-app-shell-r14-28-20-buildfix50-v1'\") || serviceWorker.includes(\"const APP_CACHE = 'texise-app-shell-r14-28-20-buildfix51-v1'\") || (serviceWorker.includes(\"const APP_CACHE = 'texise-app-shell-r14-28-20-buildfix51-2-v1'\") || serviceWorker.includes(\"const APP_CACHE = 'texise-app-shell-r14-28-20-buildfix51-3-v1'\") || serviceWorker.includes(\"const APP_CACHE = 'texise-app-shell-r14-28-20-buildfix51-4-v1'\"))), 'R14.28.20 BF39"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 386,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('offline PWA icon cache', serviceWorker.includes(\"'/texise-icons/app-icon-192.png'\") && serviceWorker.includes(\"'/texise-icons/app-icon-512.png'\"), 'PWA icons must be part of the app-shell cache');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 390,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('startup service worker registration', browserEntry.includes('texise-texlive-sw.js?build=${encodeURIComponent(APP_BUILD_TIME)}') && browserEntry.includes(\"updateViaCache: 'none'\"), 'service worker must be registered at startup with cache-bypassing update checks');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 472,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "indexedDbProjectStorage.includes(\"const DIRECTORY_MARKER = '.texise-directory'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 510,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "browserRouteTests.includes('should decode TeXise editor file %s from a deep link'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 511,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'direct/reloaded editor URLs for TeXise source files must decode as editor routes instead of inherited Markdown-only not-found routes',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 519,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "pageEditorSource.includes('data-texise-latex-view=\"source\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 520,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "pageEditorSource.includes('data-texise-latex-view=\"visual\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 647,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/core/service-core/src/project-terminal-service.ts').includes('TeXise scientific runtime doctor') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 651,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('packages/tooling/e2e-tests/src/latex-scientific-runtime-certification-r14-28-12.e2e.ts').includes('TEXISE_SCIENTIFIC_RUNTIME_LIVE') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 817,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes('Cross-Origin-Opener-Policy \"same-origin\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 818,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes('Cross-Origin-Embedder-Policy \"credentialless\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 819,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes(\"worker-src 'self' blob: https://cdn.jsdelivr.net\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 823,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('texise_frontend_security_headers_health_check') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 848,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/core/service-core/src/project-paper-memory-service.ts').includes('texisePaperMemory') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 852,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/platform/paper-memory-browser/src/index.ts').includes(\"const DB_NAME = 'texise-paper-memory-v1'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 853,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/platform/paper-memory-browser/src/index.ts').includes(\"const OPFS_ROOT = 'texise-paper-memory'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 942,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/platform/paper-memory-browser/src/index.ts').includes('is not supported by this TeXise build') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1032,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/service-core/src/project-review-service.ts').includes(\"const REVIEW_DB = 'texise-review-v1'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1067,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/service-core/src/project-ai-service.ts').includes('texise-ai') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1114,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/platform/local-ai-browser/src/local-ai.worker.ts').includes('texise-local-ai-v1') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1149,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/core/service-core/src/project-semantic-service.ts').includes('texiseProjectMeaning') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1150,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/platform/embedding-browser/src/index.ts').includes('texise-project-meaning-v1') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1155,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/project-tools-dialog.tsx').includes('texise-project-meaning-search') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1177,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/citation-picker-dialog.tsx').includes('texise:reference-shortlist:v2:') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1180,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/project-tools-dialog.tsx').includes('texise-research-review') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1199,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/citation-picker-dialog.tsx').includes('texise:reference-providers:v1') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1200,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/citation-picker-dialog.tsx').includes('texise:reference-shortlist:v1:') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1221,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('cached.clone().arrayBuffer()') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1222,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('cache.delete(request)') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1223,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/pdf-preview-pane.tsx').includes('texise-compile-performance') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1239,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/project-tools-dialog.tsx').includes('texise-project-text-search') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1241,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/compiler-diagnostics-list.tsx').includes('texise-compiler-diagnostics') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1243,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/service-core/src/project-pdf-service.ts').includes('texise:pdf-view:v1:') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1267,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/pages/page-editor.tsx').includes(\"texise:editor-pdf-split:v2\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1268,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/core/app/src/pages/page-editor.tsx').includes(\"const EDITOR_PDF_SPLIT_STORAGE_KEY = 'texise:editor-pdf-split:v1'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1274,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/pdf-preview-pane.tsx').includes('texise-log-status-dot') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1288,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/latex-visual-editor.tsx').includes('texise-visual-figure-placement') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1293,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.23.3 must give Visual mode TeXise-style hover handles, source-backed simple table/figure/reference editing, and one display-math insertion choice',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1349,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/platform/latex-compiler-browser/src/busytex-remote-cache.ts').includes('texise-busytex-remote-v3-') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1359,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('scripts/lib/texise-deploy.sh').includes(\"TEXISE_BUSY_COMPILER_VERSION '1.3.0' '1.4.0'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1360,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('scripts/lib/texise-deploy.sh').includes(\"TEXISE_BUSY_COMPILER_VERSION '1.3.1' '1.4.0'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1361,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('scripts/fetch-busytex-assets.mjs').includes('predates the Biber runtime required by TeXise full compiler mode') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1372,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const declaration = source.indexOf(\"const pdfPreview = page.getByTestId('texise-pdf-preview')\");"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1381,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('scripts/lib/texise-deploy.sh').includes(\"TEXISE_BUSY_COMPILER_VERSION '1.3.0' '1.4.0'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1382,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('scripts/lib/texise-deploy.sh').includes(\"TEXISE_BUSY_COMPILER_VERSION '1.3.1' '1.4.0'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1385,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'Preserved TeXise BusyTeX 1.3.x defaults must migrate to 1.4.0 and unsupported npm pins must fail before downloading the full compiler bundle',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1392,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('scripts/lib/busytex-runtime-compat.mjs').includes('TEXISE_BUSYTEXT_ABI_V14_BIBER_V2') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1402,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('scripts/lib/busytex-runtime-compat.mjs').includes('TEXISE_BUSYTEXT_LEGACY_NO_BIBER_SHIM_V1') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1416,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/platform/latex-compiler-browser/src/busytex-adapter.ts').includes('texise-busytex-worker-bridge.js') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1417,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes(\"runtimeMode === 'legacy-worker-bridge'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1424,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes("
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1427,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes("
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1430,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes("
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1446,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes("
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1465,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"BUSYTEX_WORKER_BRIDGE_URL = '/compiler/texise-busytex-worker-bridge.js'\","
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1468,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"url.searchParams.set('texise_bridge', 'buildfix25')\","
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1472,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes("
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1475,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes("
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1478,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes("
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1492,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('patch-busytex-runtime.mjs') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1493,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('v14-biber-abi2') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1510,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/ai-conversation-shell.tsx').includes('texise:ai-conversation-shell:size:v2') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1514,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/ai-conversation-shell.tsx').includes('data-testid=\"texise-ai-evidence-pane\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1583,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "compilerStatusGenerator.includes('TEXISE_TEXLIVE_REMOTE_URL') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1590,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "compilerStatusGenerator.includes('TEXISE_BUSY_TEXLIVE_ENDPOINT') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1591,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "compilerStatusGenerator.includes('TEXISE_COMPILER_PROFILE') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1592,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('scripts/fetch-busytex-assets.mjs').includes('TEXISE_BUSY_COMPILER_MODULE_URL') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1671,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "'R14.2 compiler settings loaded from /etc/texise',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1672,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "deployLib.includes('source \"${TEXISE_CONFIG_DIR}/texise.env\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1673,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "deployLib.includes('texise_ensure_env_default') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1674,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('deploy/config/texise.env.example').includes('TEXISE_TEXLIVE_REMOTE_URL=') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1675,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('deploy/config/texise.env.example').includes('TEXISE_BUSY_COMPILER_MODULE_URL=') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1676,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('deploy/config/texise.env.example').includes('TEXISE_BUSY_COMPILER_ASSET_URL='),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1677,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "'preserved /etc/texise/texise.env compiler settings must control the build and gain non-destructive defaults on upgrade',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1689,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "deployLib.includes(\"texise_frontend_request '/compiler/status.json'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1690,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "deployLib.includes(\"texise_frontend_request '/texlive/cache-manifest-text.txt'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1691,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "deployLib.includes(\"texise_frontend_request '/texlive/cache/amsmath.sty'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1692,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "deployLib.includes(\"texise_frontend_request '/texlive/cache/cm-super-ts1.enc'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1693,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "deployLib.includes(\"texise_frontend_request '/texlive/cache/cm-super-ts1.map'\"),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1701,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "compilerE2e.includes(\"getByTestId('texise-pdf-preview').locator('canvas')\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1732,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "compilerStatusGenerator.includes('TEXISE_TEXLIVE_STATIC_MIRROR_URL') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1733,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "compilerStatusGenerator.includes('TEXISE_TEXLIVE_LSR_URL') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1735,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "deployLib.includes(\"texise_frontend_request '/texlive/texlive-lsr.txt'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1753,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "serviceWorker.includes(\"type: 'texise-texlive-resolution'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1765,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r147CompilerE2e.includes(\"getByTestId('texise-pdf-preview').locator('canvas')\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1841,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualCssSource.includes('.texise-visual-inline-raw'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1858,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "visualCssSource.includes('.texise-visual-list-item') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1913,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "r1410StorageService.includes('DEFAULT_TEXISE_MAIN_TEX') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1932,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "r1410CrossBrowserE2e.includes(\"TEXISE_RELEASE_QUALITY !== '1'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1935,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "r1410ReleaseRunner.includes(\"TEXISE_RELEASE_QUALITY: '1'\"),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1948,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'release browser certification must explicitly target current TeXise project/editor contracts rather than stale note-first UI tests',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1954,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "r1410QualityRunner.includes(\"'TeXise production Chromium Playwright suite'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1955,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "r1410QualityRunner.includes(\"'TeXise production Firefox Playwright suite'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1963,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "// R14.11 TeXise Visual UX gates. Reuse the original interaction chrome, but"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1971,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.11 original TeXise block handles in Visual mode',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 1991,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'slash and + insertion must share one TeXise-style menu whose commands create canonical LaTeX structures',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2003,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.11 TeXise-style selection formatting toolbar',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2004,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r1411VisualSource.includes('texise-visual-selection-toolbar') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2023,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "r1411VisualE2e.includes('restores TeXise slash menu, plus handle, drag grip and selection toolbar') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2034,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'Chromium and Firefox release certification must include the TeXise Visual UX regression test',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2081,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r1412Package.scripts?.['texise:contract-audit'] === 'node scripts/texise-release-audit.mjs' &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2082,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r1410QualityRunner.includes(\"['static-contract-audit', ['run', 'texise:contract-audit']]\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2090,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "// R14.13 P1 native TeXise Visual interaction gates."
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2096,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.13 native inline TeXise slash suggestions',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2106,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'Visual slash must use the editor-scoped TeXise suggestion mark/store/keymap, keep focus in ProseMirror, and exclude synthetic query text from canonical LaTeX',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2132,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r1411VisualSource.includes('texise-visual-drop-before') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2133,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r1411VisualSource.includes('texise-visual-drop-after') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2152,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "r1410QualityRunner.includes('R14.13 native TeXise Visual interactions') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2166,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const r1414Env = read('deploy/config/texise.env.example');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2171,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!swiftCompilerSource.includes('__texise_synctex__.tex') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2186,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "latexVisual.includes('texise-visual-math-fallback'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2196,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'typed slash must be owned by the TeXise suggestion plugin; left + may only open the same suggestion state programmatically',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2213,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "r1414Env.includes('TEXISE_COMPILER_PROFILE=full') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2214,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "r1414Env.includes('TEXISE_BUSY_COMPILER_VERSION=1.4.0') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2221,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "deployLib.includes(\"TEXISE_COMPILER_PROFILE:-full\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2227,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "r1410QualityRunner.includes(\"TEXISE_COMPILER_PROFILE: 'full'\"),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2247,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r1414E2e.includes('__texise_synctex__.tex') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2268,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "pageEditorSource.includes('data-testid=\"texise-split-workspace\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2269,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "pageEditorSource.includes('data-testid=\"texise-editor-toolbar\"'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2278,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r1415Pdf.includes('data-testid=\"texise-pdf-toolbar\"'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2329,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "// R14.16 TeXise Source editor migration gates. These are static"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2333,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const r1416PluginToolbar = read('packages/core/app/src/components/texise-plugin-toolbar.tsx');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2339,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.16 TeXise CodeMirror session foundation',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2352,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r1415Source.includes(\"texise:latex-source:soft-wrap\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2362,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.16 TeXise plugin-toolbar migration',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2372,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'Source formatting must be driven by the TeXise controller/toolbar command model with responsive overflow and selection-safe mouse handling',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2392,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "r1416E2e.includes('runs the TeXise toolbar') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2394,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "r1410QualityRunner.includes('R14.16 TeXise Source migration') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2395,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "r1410QualityRunner.includes('R14.16 TeXise Source editor'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2429,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.17 TeXise per-file CodeMirror state restoration',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2438,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'Source sessions must preserve per-file selection, scroll and TeXise CodeMirror history without replaying stale history after a canonical revision change',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2491,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.18 unified TeXise MathLive region model',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2506,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'Source and Visual must share TeXise delimiter/environment/row detection and one exact MathLive replacement path',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2526,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "r1418VisualUnit.includes('same suggestion mark used by the TeXise left + path'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2527,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'Source toolbar, Visual slash/left+ and Visual formatting must consume one semantic command registry and native / must use the TeXise suggestion mark',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2531,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "r1418E2e.includes('share the TeXise MathLive exact-source model') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2533,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r1418E2e.includes(\"getByTestId('texise-mathlive-preview')\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2580,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "entitlementSource.includes('__TEXISE_ENTITLEMENT_PUBLIC_KEY__') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2584,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "browserVite.includes('__TEXISE_ENTITLEMENT_PUBLIC_KEY__') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2585,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "deployLib.includes('TEXISE_ENTITLEMENT_PUBLIC_KEY_PEM=\"$(cat') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2591,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "entitlementSource.includes('__TEXISE_ENTITLEMENT_KEY_ID__') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2599,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "http.includes('https://www.texise.com%{REQUEST_URI}') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2603,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "deployLib.includes('texise_frontend_security_headers_health_check'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2622,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "aiServiceSource.includes(\"const CLOUD_CREDENTIAL_DB = 'texise-ai-credentials-v1'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2639,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'primary TeXise UI and error/privacy links must not point users at inherited Bangle services',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2647,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'privacy and diagnostic-report surfaces must be TeXise-owned/same-origin by default',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2682,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r144PdfSource.includes('texise-pdf-text-layer') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2691,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r144PdfSource.includes('texise-pdf-search-active') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2751,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "r31GitSettings.includes(\"DEFAULT_TEXISE_GIT_CORS_PROXY = 'https://cors.isomorphic-git.org'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2779,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes(\"import { WebsocketProvider } from 'y-websocket'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2780,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes('new WebsocketProvider(relayBaseUrl(), roomKey, doc') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2781,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes('syncProtocol.') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2792,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'production collaboration must use the standard state-vector synchronized TeXise same-origin Yjs document/awareness relay rather than public/direct peer signaling or opaque snapshot replacement',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2803,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const r145Systemd = read('deploy/systemd/texise.service');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2806,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "deployLib.includes('texise_activate_runtime_server()') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2807,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "deployLib.includes('texise_restore_previous_runtime()') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2808,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "deployLib.includes('texise_release_pair_health_check()') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2812,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "deployLib.includes('\\\"${TEXISE_SOURCE_ROOT}/node_modules/${runtime_dependency}\\\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2813,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "deployLib.includes('\\\"${TEXISE_RUNTIME_NEXT}/server/node_modules/${runtime_dependency}\\\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2814,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "!deployLib.includes('ln -s \\\"${TEXISE_SOURCE_ROOT}/node_modules\\\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2815,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "r145Systemd.includes('/var/www/texise.com/public_html/texise-data/runtime/current/server/index.mjs') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2831,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const r145ReleaseWorkflow = read('.github/workflows/texise-release-quality.yml');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2859,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!r145CollaborationE2e.includes('cm-texise-collaboration-authorship') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2861,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!r145CollaborationE2e.includes('texise-collaboration-signaling') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2881,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const templateManifest = JSON.parse(read('texise-templates/templates.json'));"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2887,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('template runtime manifest loading', templateRuntime.includes('loadProjectTemplateManifest') && templateRuntime.includes('/texise-templates/templates.json'), 'browser template runtime must consume the generated manifest');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2890,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const envExample = read('deploy/config/texise.env.example');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2896,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "check('trusted API loopback', envExample.includes('TEXISE_HOST=127.0.0.1'), 'trusted API must default to loopback');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2899,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "// R14.19 TeXise editor feature parity gates. Static validation only; browser"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2914,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.19 must provide citation/reference/project-path completion through the TeXise Source stack',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2923,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.19 Ctrl/Cmd-click navigation must resolve through TeXise navigation and explicit selection semantics',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2929,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.19 Source paste must reuse TeXise project asset import rather than inventing an independent storage path',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 2945,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r1419ProjectFeatures.includes('cm-texise-search-highlight'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3048,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const r1421DeployLib = read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3116,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "r1421DeployLib.includes('TEXISE_DEPLOY_CERTIFY') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3118,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "r1421DeployLib.includes('texise_pnpm run lint:ci') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3119,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "r1421DeployLib.includes('TEXISE_BUSY_COMPILER_CACHE_DIR') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3123,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'normal install/upgrade must avoid rerunning the full browser matrix, while TEXISE_DEPLOY_CERTIFY=1 keeps formal Edge/Chromium/Firefox certification available',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3166,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/fetch-busytex-assets.mjs').includes('.texise-busytex-manifest.json') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3174,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes('max-age=0, must-revalidate') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3175,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-http.conf').includes('https://www.texise.com%{REQUEST_URI}') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3221,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/compile-panel.tsx').includes('texise-compile-primary') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3226,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/pdf-preview-pane.tsx').includes('data-testid=\"texise-output-tabs\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3237,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/pages/page-editor.tsx').includes(\"EDITOR_PDF_SPLIT_STORAGE_KEY = 'texise:editor-pdf-split:v2'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3239,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/pages/page-editor.tsx').includes('latex-bedrive-resizer texise-drive-browser-editor-resizer hidden lg:flex') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3246,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/index.css').includes('.latex-bedrive-resizer.texise-drive-browser-editor-resizer') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3260,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/core/app/src/components/compile-panel.tsx').includes('data-testid=\"texise-compiler-indicator\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3283,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/core/app/src/components/compile-panel.tsx').includes('texise-compiler-indicator') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3303,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts').includes(\"TEXISE_LIVE_DRAFT_DIR = '__texise_live__'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3313,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/core/initialize-services/src/index.ts').includes('texiseLiveDraftProbe') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3318,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R4 must certify BusyTeX LuaLaTeX with a self-contained TeXise document, directlua, MEMFS shipout evidence and real PDF bytes while remaining isolated from manual Compile',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3336,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('activateCurrentRelease') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3337,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('client.navigate(client.url)') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3338,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes(\"fetch(request, { cache: 'no-store' })\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3339,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('packages/platform/latex-compiler-browser/src/busytex-adapter.ts').includes(\"TEXISE_BUSYTEXT_ADAPTER_RELEASE = 'buildfix25'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3353,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('const raw = file.contents !== undefined ? file.contents : file.content;') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('TEXT_PROJECT_FILE.test(path) ? utf8Decoder.decode(bytes) : bytes') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3355,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('BusyTeX source integrity:') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3356,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('recoverLegacyByteString') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3357,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('hasBeginDocument'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3369,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('verifyTexliveBootstrap') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3370,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('/texlive/texmf-dist/web2c/texmf.cnf') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3371,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('/texlive/texmf-dist/texmf-var/web2c/pdftex/pdflatex.fmt') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3372,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('cm-super-ts1.enc') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3373,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('cm-super-ts1.map') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3383,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('projectRemoteMissKeys') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3384,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('kpse_remote_register_misses') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3385,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('purgeUnsafeTexliveRemoteEntries') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3386,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('blockedTexliveRemoteNames') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3387,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('kpse_remote_clear') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3388,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/compiler/texise-busytex-worker-bridge.js').includes('Rejected invalid TeX Live remote response') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3389,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('client.navigate(client.url)') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3414,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/floating-research-dock.tsx').includes('data-testid=\"texise-ai-open\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3480,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('deploy/config/texise.env.example').includes('OPENCITATIONS_API_KEY'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3481,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14 must terminate administrator scholarly credentials on the TeXise server and expose only capability booleans to browser code.',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3562,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "read('server/config.mjs').includes(\"aiReviewAuditDb: '/var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3563,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "read('deploy/config/texise.env.example').includes('TEXISE_AI_REVIEW_AUDIT_DB=/var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3564,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "read('deploy/systemd/texise.service').includes('ReadOnlyPaths=/etc/texise /var/www/texise.com/public_html/texise-data/runtime/current') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3565,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "read('deploy/systemd/texise.service').includes('/var/www/texise.com/texise-media/blog /var/www/texise.com/texise-media/docs') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3566,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "read('deploy/systemd/texise.service').includes('/var/www/texise.com/public_html/dist/texise-media') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3567,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "read('scripts/lib/texise-deploy.sh').includes(\"TEXISE_AI_REVIEW_AUDIT_DB '/etc/texise/ai-review-audit.sqlite3' '/var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3569,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "'R24 must audit only operational/accounting fields in /var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3 and never persist manuscript, prompt, answer, or API-key fields.',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3608,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/platform/paper-memory-browser/src/index.ts').includes('texise-paper-memory-v1') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3657,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/platform/latex-compiler-browser/src/busytex-live-lua-compiler.ts').includes('__texise_live_instant__.tex') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3691,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/service-core/src/project-ai-service.ts').includes(\"const CLOUD_CREDENTIAL_DB = 'texise-ai-credentials-v1'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3699,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "!read('server/config.mjs').includes('TEXISE_AI_REVIEW_OPENAI_API_KEY'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3711,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/service-core/src/project-ai-service.ts').includes(\"const CLOUD_CREDENTIAL_DB = 'texise-ai-credentials-v1'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3768,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes(\"aiSuggestButton.textContent = 'AI'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3805,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'Structured AI responses must preserve raw LaTeX backslashes and hidden .texise review artifacts must open through the direct report viewer rather than the visible-workspace router.',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3811,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('packages/core/service-core/src/project-ai-writing-service.ts').includes('Never output [TEXISE_END] or any [TEXISE_*] marker.') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3822,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/saas.css').includes('.texise-pricing-auth-note { font-size: .72rem; line-height: 1.45; }') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3823,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/saas.css').includes('.texise-about-page .texise-eyebrow { font-family: var(--texise-font-ui); }') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3824,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/saas.css').includes('.texise-blog-article-prose ul { list-style-type: disc; }') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3825,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/saas.css').includes('.texise-blog-article-prose ol { list-style-type: decimal; }'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3901,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/ai-settings-events.ts').includes(\"AI_SETTINGS_OPEN_EVENT = 'texise:open-ai-settings'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3906,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "!aiSettingsSource.includes('When enabled, TeXise reviews the manuscript line') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3908,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!aiOverlaySource.includes('data-testid=\"texise-ai-settings\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3925,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "!compilePanelSource.includes('Once needed, TeXise remembers it for this project') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3936,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('scripts/repair-buildfix50-source.mjs').includes('Cloud Compile uses TeXise’s isolated Docker TeX Live environment.') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3939,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "!read('scripts/repair-buildfix50-source.mjs').includes(\"compilePanel.includes('temporarily sent to TeXise’s isolated Docker compiler')\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3947,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/index.css').includes('.texise-pdf-text-layer :is(span, br) {') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3961,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('deploy/config/texise.env.example').includes('TEXISE_FREE_PLAN_LIMIT=5') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3962,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('scripts/lib/texise-deploy.sh').includes(\"texise_ensure_env_default \\\"${env_file}\\\" TEXISE_FREE_PLAN_LIMIT '5'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3963,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('Free plan project limit: ${free_plan_limit}') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3964,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('server/config.mjs').includes('freePlanProjectLimit: parseFreePlanProjectLimit(env.TEXISE_FREE_PLAN_LIMIT)') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3976,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('server/saas-migrations.mjs').includes('{{TEXISE_FREE_PLAN_LIMIT}}') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3979,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'Fix37 must source the Free owned-project cap from TEXISE_FREE_PLAN_LIMIT, enforce it for anonymous and signed-in Free users without double allowance, exclude joined collaborations, keep existing projects accessible and leave Pro unlimited.',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3991,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-http.conf').includes('https://www.texise.com%{REQUEST_URI}') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 3992,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes('https://webr.r-wasm.org') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4088,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes(\"class: 'texise-latex-visual-editor'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4089,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes(\"options.host.addEventListener('pointermove', pointerMove)\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4090,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes(\"blockHandle.wrapper.addEventListener('pointerenter'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4091,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('emitMathEditor') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4092,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('const replaceTableData =') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4093,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('initialColumns') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4094,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/index.css').includes('.texise-latex-visual-editor:focus-visible') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4095,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/index.css').includes('.texise-visual-native-table-toolbar') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4102,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts').includes('standalone and complex structural LaTeX render as protected rectangular cards') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4103,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts').includes('native table metadata can seed CSV data and remains centred') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4105,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts').includes('Visual figure insertion uses a compiler-safe asset path and provisions graphicx'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4106,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'BF4.2 must restore the protected-card/MathLive/table/gutter UX on the native TeXise editor and carry compiler-safe image assets into Live PDF without restoring BF3 source-first typing.',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4112,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('implicitSourceSelection') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4113,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('mapPmToSource(currentSerialized.maps, previousSelection.anchor)') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4114,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('mapSourceToPm(serialized.maps, requestedAnchor)') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4115,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('const fallbackHead = Math.max(0, Math.min(doc.content.size, previousSelection.head))') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4116,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts').includes('never synthesizes TeXise review metadata into Visual-serialized LaTeX') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4117,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('texise-bf4-block') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4118,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('view.serializeForClipboard(slice)') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4119,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes(\"Press '/' for commands\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4120,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('setupImmutableLatexProtection') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4121,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes(\"tableActionsSummary.setAttribute('aria-label', 'Table actions')\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4122,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('pasteSpreadsheetIntoTable') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4123,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('tableColumnSpecForWidth') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4144,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/tooling/e2e-tests/src/latex-comments-r14-27-0.e2e.ts').includes(\"not.toContain('TEXISE-REVIEW')\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4147,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts').includes('TeXise block drag moves PM content and never inserts the old sentinel text') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4148,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts').includes(\"value.indexOf('Second block.')\"),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4149,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'BF4.4 must preserve a live Visual selection across structural refreshes, use ProseMirror-native block drag, provide TeXise-style table/placeholder behavior, protect immutable structural LaTeX, hide AI protocol JSON and keep comments/review metadata out of canonical LaTeX source.',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4155,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/js-lib/latex-visual/src/__tests__/visual-bf4-native.spec.ts').includes(\"not.toContain('TEXISE-REVIEW')\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4162,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/js-lib/latex-visual/src/native-texise-editor.ts').match(/stopEvent:\\s*\\(event\\)\\s*=>/) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4163,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/js-lib/latex-visual/src/native-texise-editor.ts').match(/stopEvent:\\s*\\(event: Event\\)\\s*=>/g) ?? []).length >= 2 &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4172,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const native = read('packages/js-lib/latex-visual/src/native-texise-editor.ts');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4202,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('const executeNativeSlashCommand =') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4203,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('const splitNativeSlashParagraph =') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4204,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('replaceSlashParagraphWithBlocks') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4205,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes(\"command === 'section'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4206,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes(\"command === 'subsection'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4207,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes(\"command === 'bullet-list' || command === 'numbered-list'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4208,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts').includes('const insertNativeTableAtSlash =') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4214,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/e2e-tests/src/latex-visual-bf4-texise-native.e2e.ts').includes(\"mutate MathLive's authoritative field without dispatching a\"),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4240,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'TX7 presence must use Awareness user identity plus y-codemirror-owned named carets/selections without a second TeXise file/mode/range cursor channel.',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4245,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/saas/learn-pages.tsx').includes(\"texise:learn:completed:v1\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4255,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('texise-services/console-gateway/package.json').includes('\"ws\": \"8.21.3\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4256,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('texise-services/console-gateway/package-lock.json').includes('\"version\": \"8.21.3\"'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4267,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/core/app/src/saas/learn-pages.tsx').includes('className=\"texise-learn-progress\" aria-label='),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4273,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "read('packages/tooling/browser-entry/src/main.tsx').includes('installTeXiseLocationChangeBridge(window)') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4274,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "read('packages/tooling/browser-entry/src/main.tsx').includes('TeXiseRootApplication') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4275,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('packages/tooling/browser-entry/src/main.tsx').includes(\"window.addEventListener(TEXISE_LOCATION_CHANGE_EVENT, synchronize)\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4278,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/main.tsx').includes('texise-texlive-sw.js?build=${encodeURIComponent(APP_BUILD_TIME)}') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4279,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('packages/tooling/browser-entry/src/ws-boot-surface.ts').includes(\"TEXISE_LOCATION_CHANGE_EVENT = 'texise:locationchange'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4282,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix50-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || r"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4288,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "!read('packages/js-lib/project-collaboration/src/index.ts').includes(\"AUTHORSHIP_ATTRIBUTE = 'texiseAuthor'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4295,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/service-core/src/project-review-service.ts').includes(\"const REVIEW_DB = 'texise-review-v1'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4305,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/tikz-draw/index.html').includes('texise-tikz-draw') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4306,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "read('packages/tooling/browser-entry/public/tikz-draw/index.html').includes('insertIntoTeXise()') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4315,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'BF17 must vendor the MIT TikZ Draw editor locally in a large TeXise modal and route generated TikZ/images through canonical browser-local project APIs.',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4324,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/tikz-draw/index.html').includes('--texise-tool-bg:#ffffff') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4325,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/tikz-draw/index.html').includes('--texise-tool-active:#DA0B4E') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4326,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/tikz-draw/index.html').includes('--texise-tool-fg:#111111') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4329,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix50-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || r"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4351,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes(\"import { WebsocketProvider } from 'y-websocket'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4352,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes('new WebsocketProvider(relayBaseUrl(), roomKey, doc') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4353,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes('waitForSync(timeoutMs = 12_000)') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes('syncProtocol.') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4355,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes('socket.send(') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4369,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('/collab-live') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4370,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes('ProxyPass        /collab-live ws://127.0.0.1:3101/collab-live'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4390,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes(\"import { WebsocketProvider } from 'y-websocket'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4391,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes('let unsubscribe: (() => void) | undefined') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4392,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes('unsubscribe?.()') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4393,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes('socket.send(') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4412,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "(read('packages/core/app/src/pages/page-editor.tsx').includes('TexLab</span>') || read('packages/core/app/src/pages/page-editor.tsx').includes('TeXise Terminal')) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4433,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/js-lib/project-collaboration/src/texise-websocket-provider.ts').includes('COLLABORATION_PROTOCOL_VERSION = 7') || read('packages/js-lib/project-collaboration/src/collaboration-capabilities.ts').includes('COLLABORATION_PROTOCOL_VERSION = 7')) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4434,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/project-collaboration/src/index.ts').includes(\"PERSISTENCE_NAMESPACE = 'texise-collaboration-v7'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4449,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/service-core/src/project-collaboration-service.ts').includes(\"const COLLAB_USER_ID_KEY = 'texise-collaboration-user-id'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4450,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/service-core/src/project-collaboration-service.ts').includes(\"const COLLAB_USER_NAME_KEY = 'texise-collaboration-name'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4451,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/service-core/src/project-collaboration-service.ts').includes(\"const COLLAB_USER_COLOR_KEY = 'texise-collaboration-color'\") &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4465,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix50-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || r"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4466,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "(read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 50') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51.1')) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4470,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('scripts/install.sh').includes('repair-buildfix50-source.mjs\" \"${TEXISE_SOURCE_ROOT}\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4471,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('node scripts/repair-buildfix50-source.mjs \"$PWD\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4479,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/js-lib/project-collaboration/src/index.ts').includes('texise-collaboration-v1') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4483,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "(read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 50') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51.1')) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4485,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix50-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || r"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4506,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/saas/saas-app.tsx').includes('texise-projects-page--empty') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4507,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/saas.css').includes('.texise-projects-empty-state') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4526,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/js-lib/latex-codemirror/src/project-features.ts').includes('cm-texise-review-conflicted') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4538,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/components/account-popover.tsx').includes('texise-account-popover') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4539,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/saas/saas-app.tsx').includes('/texise-logo-mobile.png') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4540,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/saas/saas-app.tsx').includes('/texise-logo.png') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4542,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "read('packages/core/app/src/saas/saas-app.tsx').includes('texise-license-link-card'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4556,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('texise_collaboration_live_health_check() (') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4582,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('deploy/config/texise.env.example').includes('TEXISE_GOOGLE_TAG_ID=') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4583,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes('https://www.statcounter.com') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4584,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes('https://www.googletagmanager.com'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4592,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/core/app/src/components/public-home/home-hero.tsx').includes('TeXise — Privacy First Research') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4598,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/core/app/src/pages/page-editor.tsx').includes('texise-editor-toolbar flex shrink-0') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4599,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/ws-texise.css').includes('overflow-x: auto') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4601,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/saas.css').includes('font-family: var(--texise-font-body);') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4603,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/core/app/src/saas/public-marketing.tsx').includes('TeXise vs Overleaf') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4606,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('packages/core/app/src/components/public-home/home-workflows-showcase.tsx').includes('Explore TeXise'),"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4607,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'The BF50 public redesign must preserve the BF39 Source/Visual reveal, compile/terminal simulation and editor toolbar protections while restoring the approved TeXise workflow showcase.',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4616,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('server/template-manifest.mjs').includes('TEXISE_TEMPLATE_ROOT') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4617,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('server/template-manifest.mjs').includes('TEXISE_TEMPLATE_PUBLIC_COPY') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4620,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('texise_prepare_template_runtime_permissions') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4621,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('texise_template_runtime_health_check') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4622,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('check-staged-trusted-runtime.mjs') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4623,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "read('deploy/systemd/texise.service').includes('/var/www/texise.com/templates') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4624,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "read('deploy/systemd/texise.service').includes('/var/www/texise.com/public_html/dist/texise-templates') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4625,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix50-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || r"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4638,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes('DirectoryIndex index.html') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4639,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes('RewriteRule ^$ http://127.0.0.1:3100/__texise/render/ [P,L,NE]') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4640,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes('RewriteRule ^/?index\\\\.html$ https://www.texise.com/ [R=301,L,NE]') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4641,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('a2enmod rewrite proxy proxy_http proxy_wstunnel headers mime alias dir') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4642,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('TeXise frontend route diagnostics follow:') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4643,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('for probe_path in / /index.html /about') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4644,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "(read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 50') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51.1')) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4645,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix50-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || r"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4679,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('texise-templates/templates.json').includes('UNSW PhD Thesis Starter — Demo') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4680,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('texise-templates/templates.json').includes('\\\"noIndex\\\": true') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4683,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('texise-templates/institutions.json').includes('UNSW Sydney') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4684,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "(read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 50') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51.1')) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4685,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix50-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || r"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4707,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "(read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 50') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51.1')) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4709,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix50-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || r"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4721,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "(read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 50') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51.1')) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4723,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix50-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || r"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4730,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/src/index.css').includes('.texise-latex-visual-editor > *') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4742,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'R14.28.20 BF49 editor Templates CTA, TeXise icons and recency-sorted Projects UX',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4744,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/ui/ui-components/src/app-sidebar.tsx').includes('texise-compile-primary w-full') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4751,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "sha256File('packages/tooling/browser-entry/public/texise-icons/app-icon-180.png') === 'b2a5a74e77c8fafac0512788f2a4b6949521ae27f19495cbe7629ca420b55f49' &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4752,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "sha256File('packages/tooling/browser-entry/public/texise-icons/app-icon-192.png') === '9f0f6bb40e512bc4c864688979351321448db42b8cf9fc429f55e6a4181adf6d' &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4753,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "sha256File('packages/tooling/browser-entry/public/texise-icons/app-icon-512.png') === 'd70d02fbabf3accaca63061bafbbd53698b320495ad0c570325afdd34439dc0d' &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4755,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "'The editor sidebar must link to Templates with the Compile-yellow treatment, the supplied TeXise icons must replace the old app icons, and Projects must expose dedicated ZIP import plus recency ordering.',"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4795,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "read('server/config.mjs').includes('TEXISE_PRO_MONTHLY_SHOP') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4796,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "(read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 50') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51') || read('scripts/install.sh').includes('Installing TeXise R14.28.20 Build Fix 51.1')) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4797,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix50-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || r"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4814,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('server/saas-migrations.mjs').includes('Using Ollama with TeXise') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4815,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "read('deploy/apache/texise.com-https.conf').includes('http://127.0.0.1:* http://localhost:*') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4816,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('bingbot/2.0') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4817,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('texise_indexnow_key_health_check') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4822,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('repair-buildfix51-source.mjs \"$PWD\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4832,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('repair-buildfix51-1-source.mjs \"$PWD\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4833,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-4-v1'))) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4855,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/verify-public-seo-production.sh').includes('data-texise-prerender') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4869,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('repair-buildfix51-2-source.mjs \"$PWD\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4870,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-2-v1') || (read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-4-v1'))) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4887,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('server/saas-migrations.mjs').includes('ollama create texise-academic') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4900,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('repair-buildfix51-3-source.mjs \"$PWD\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4901,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "(read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-3-v1') || read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-4-v1')) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4925,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('repair-buildfix51-4-source.mjs \"$PWD\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4927,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('packages/tooling/browser-entry/public/texise-texlive-sw.js').includes('texise-app-shell-r14-28-20-buildfix51-4-v1') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4946,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('server/public-seo.mjs').includes('data-texise-prerender=\"change-log\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4947,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('server/public-seo.mjs').includes('texise-page-container texise-change-log-page') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4948,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('server/public-seo.mjs').includes('texise-change-log-timeline') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4949,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('server/public-seo.mjs').includes('data-texise-prerender-shell') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4950,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('server/public-seo.mjs').includes('data-texise-prerender-shell hidden aria-hidden=\"true\"') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4951,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('server/public-seo.mjs').includes('texise-prerender-visibility') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4952,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "!read('packages/tooling/browser-entry/src/saas.css').includes('texise-prerender-visibility') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4954,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/verify-public-seo-production.sh').includes(`verify_html '/change-log' change-log 'data-texise-prerender=\"change-log\"'`) &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4961,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "read('scripts/lib/texise-deploy.sh').includes('server/compare-content.json') &&"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4974,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "console.error('\\nTeXise static contract audit failed:');"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4979,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "console.log(`\\nTeXise static contract audit passed (${checks.length} checks).`);"
    },
    {
      "path": "scripts/texise-release-audit.mjs",
      "line": 4980,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise] Static contract checks do not certify browser/runtime behavior. Run `pnpm run release:quality` for production browser certification.');"
    },
    {
      "path": "scripts/texise-saas",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "RUNTIME_SERVER=/var/www/texise.com/public_html/texise-data/runtime/current/server"
    },
    {
      "path": "scripts/texise-saas",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "ENV_FILE=/etc/texise/texise.env"
    },
    {
      "path": "scripts/texise-saas",
      "line": 9,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "Usage: texise-saas <status|preflight|admin-create|logs>"
    },
    {
      "path": "scripts/texise-saas",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "admin-create  Explicitly create/reset admin@texise.com; password is read interactively from stdin."
    },
    {
      "path": "scripts/texise-saas",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "echo '[TeXise error] Active runtime does not contain the SaaS preflight command. Install the current release first.' >&2"
    },
    {
      "path": "scripts/texise-saas",
      "line": 24,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--unit=\"texise-saas-preflight-$$\" \\"
    },
    {
      "path": "scripts/texise-saas",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--property=User=texise \\"
    },
    {
      "path": "scripts/texise-saas",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--property=Group=texise \\"
    },
    {
      "path": "scripts/texise-saas",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl --no-pager --full status texise.service || true"
    },
    {
      "path": "scripts/texise-saas",
      "line": 44,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "[[ -f \"${RUNTIME_SERVER}/saas-admin-create.mjs\" ]] || { echo '[TeXise error] Active runtime does not contain admin provisioning.' >&2; exit 1; }"
    },
    {
      "path": "scripts/texise-saas",
      "line": 46,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "--unit=\"texise-saas-admin-create-$$\" \\"
    },
    {
      "path": "scripts/texise-saas",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "--property=User=texise --property=Group=texise \\"
    },
    {
      "path": "scripts/texise-saas",
      "line": 54,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "journalctl -u texise.service -n 100 --no-pager -o cat"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 54,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const css = await read('packages/tooling/browser-entry/src/texise-design.css');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 55,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\[data-editor-engine='latex-visual'\\] \\.ProseMirror \\{[\\s\\S]*?font-family: var\\(--texise-font-manuscript\\)/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 56,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const manuscriptUses = [...css.matchAll(/font-family:\\s*var\\(--texise-font-manuscript\\)/gu)].length;"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 59,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.ok(!/font-family:\\s*var\\(--texise-font-manuscript\\)/u.test(beforeScope), 'STIX leaks before visual manuscript scope');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 85,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const onboarding = /Welcome to TeXise|Step 1 of \\d+|What do you want to write\\?|guided setup|setup tour/u;"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 98,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const manifest = JSON.parse(await read('texise-templates/templates.json'));"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 124,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "assert.match(source, /TeXiseRootApplication/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 125,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(source, /TEXISE_LOCATION_CHANGE_EVENT/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 171,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const httpSource = await read('deploy/apache/texise.com-http.conf');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 172,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const httpsSource = await read('deploy/apache/texise.com-https.conf');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 173,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(httpSource, /ServerName www\\.texise\\.com/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 174,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(httpSource, /RewriteRule \\^ https:\\/\\/www\\.texise\\.com%\\{REQUEST_URI\\} \\[R=301,L,NE\\]/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 178,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(httpsSource, /__texise\\/render/u, 'HTTPS vhost missing server-rendered SEO route fallback');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 181,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(httpsSource, /<Location \"\\/texise-templates\\/templates\\.json\">[\\s\\S]*?no-cache/su, 'HTTPS vhost missing template manifest revalidation');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 182,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(httpsSource, /<Location \"\\/texise-templates\\/categories\\.json\">[\\s\\S]*?no-cache/su, 'HTTPS vhost missing template category registry revalidation');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 186,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const source = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 187,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(source, /TEXISE_MYSQL_CREATE_DATABASE/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 194,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(source, /\\/texise-templates\\/templates\\.json/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 195,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(source, /\\/texise-templates\\/categories\\.json/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 226,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(app, /texise:preferred-project-storage/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 257,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(app, /texise-admin-avatar/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 307,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(app, /className=\"texise-admin-search-field\"/u, 'admin search wrapper must not use a label around a custom Input');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 308,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.ok(!/texise-admin-list-controls\"><label/u.test(app), 'custom Input is still wrapped by an unassociated label');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 317,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 321,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const helper = await read('scripts/texise-saas');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 322,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const unit = await read('deploy/systemd/texise.service');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 323,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(deploy, /texise_saas_preflight_runtime\\(\\)/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 324,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /npm install[\\s\\S]*texise_saas_preflight_runtime \"\\$\\{TEXISE_RUNTIME_NEXT\\}\\/server\"[\\s\\S]*mv \"\\$\\{TEXISE_RUNTIME_NEXT\\}\" \"\\$\\{TEXISE_RUNTIME_CURRENT\\}\"/su, 'SaaS preflight must happen before runtime activation');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 325,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(deploy, /journalctl -u texise\\.service -n 80 --no-pager -o cat/u, 'failed health checks should show the service journal');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 326,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(preflight, /admin@texise\\.com/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 338,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 339,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const unit = await read('deploy/systemd/texise.service');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 341,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /install -d -o root -g texise -m 0750 \"\\$\\{TEXISE_CONFIG_DIR\\}\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 342,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(deploy, /chown root:texise \"\\$\\{env_file\\}\"[\\s\\S]*?chmod 0640 \"\\$\\{env_file\\}\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 343,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(deploy, /chown root:texise \"\\$\\{private_key\\}\"[\\s\\S]*?chmod 0640 \"\\$\\{private_key\\}\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 344,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(deploy, /chown root:texise \"\\$\\{public_key\\}\"[\\s\\S]*?chmod 0640 \"\\$\\{public_key\\}\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 345,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(deploy, /texise_log \"Preserving \\$\\{public_key\\}\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 346,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(deploy, /texise_normalize_config_permissions\\(\\)/u, 'final config permission normalization helper missing');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 347,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(deploy, /texise_verify_config_permissions\\(\\)/u, 'config permission post-condition verifier missing');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 353,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(installScript, /texise_install_signing_keys\\ntexise_normalize_config_permissions\\ntexise_install_dependencies/u, 'install must normalize after key preservation');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 354,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(upgradeScript, /texise_install_signing_keys\\ntexise_normalize_config_permissions\\ntexise_install_dependencies/u, 'upgrade must normalize after key preservation');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 355,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_AI_REVIEW_AUDIT_DB '\\/var\\/lib\\/texise\\/ai-review-audit\\.sqlite3' '\\/var\\/www\\/texise\\.com\\/public_html\\/texise-data\\/audit\\/ai-review-audit\\.sqlite3'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 356,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(config, /aiReviewAuditDb: '\\/var\\/www\\/texise\\.com\\/public_html\\/texise-data\\/audit\\/ai-review-audit\\.sqlite3'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 357,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(unit, /ReadOnlyPaths=\\/etc\\/texise \\/var\\/www\\/texise\\.com\\/public_html\\/texise-data\\/runtime\\/current/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 358,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(unit, /ReadWritePaths=\\/var\\/www\\/texise\\.com\\/public_html\\/texise-data\\/audit[\\s\\S]*\\/var\\/www\\/texise\\.com\\/texise-media\\/blog[\\s\\S]*\\/var\\/www\\/texise\\.com\\/texise-media\\/docs[\\s\\S]*\\/var\\/www\\/texise\\.com\\/public_html\\/dist\\/texise-media/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 363,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 364,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const env = await read('deploy/config/texise.env.example');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 365,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const css = await read('packages/tooling/browser-entry/src/texise-design.css');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 366,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const apacheHttps = await read('deploy/apache/texise.com-https.conf');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 367,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_FONT_SOURCE_DIR=\"\\$\\{TEXISE_FONT_SOURCE_DIR:-\\$\\{TEXISE_SITE_ROOT\\}\\/fonts\\}\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 372,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.ok(deploy.includes(`texise-fonts/${runtimeName}`) || deploy.includes(`target_dir}/${runtimeName}`), `production validation missing ${runtimeName}`);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 373,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.ok(css.includes(`/texise-fonts/${runtimeName}`), `CSS missing ${runtimeName}`);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 376,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(deploy, /texise_pnpm run build[\\s\\S]*?texise_install_browser_fonts[\\s\\S]*?texise_validate_production_dist/su, 'font import must happen after browser build and before dist validation');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 377,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(deploy, /texise_frontend_font_signature_check/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 378,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(env, /TEXISE_FONT_SOURCE_DIR=\\/var\\/www\\/texise\\.com\\/fonts/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 379,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(css, /--texise-font-ui: 'TeXise Inter'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 380,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(css, /--texise-font-mono: 'TeXise JetBrains Mono'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 388,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(apache, /texise-fonts/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 393,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('TeXise typography uses real Moranga light/italic/bold plus Inter/JetBrains roles', async () => {"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 394,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const design = await read('packages/tooling/browser-entry/src/texise-design.css');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 400,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(saas, /texise-section-heading \\.texise-display \\{ font-weight: 300; \\}/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 401,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(saas, /texise-pricing-card \\.texise-display \\{[^}]*font-weight: 700/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 402,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(design, /--texise-font-ui: 'TeXise Inter'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 403,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(design, /--texise-font-mono: 'TeXise JetBrains Mono'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 433,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(generator, /'texise-templates'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 438,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(runtime, /TEMPLATE_MANIFEST_URL = '\\/texise-templates\\/templates\\.json'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 440,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.ok(!browserPublic.some((file) => /packages\\/tooling\\/browser-entry\\/public\\/texise-templates\\/(?:free|pro)\\//u.test(file)), 'raw template source was mirrored into the browser public tree');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 444,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 445,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /texise_migrate_legacy_template_namespace/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 447,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /texise_migrate_legacy_template_namespace[\\s\\S]*?generate-template-manifest\\.mjs/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 452,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const [deploy, apache] = await Promise.all([read('scripts/lib/texise-deploy.sh'), read('deploy/apache/texise.com-https.conf')]);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 455,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.ok(apache.includes('RewriteRule ^/?examples/?$ https://www.texise.com/templates [R=301,L,NE]'));"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 476,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('brand lockup uses supplied responsive desktop and mobile TeXise logo assets', async () => {"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 479,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(app, /srcSet=\"\\/texise-logo-mobile\\.png\"[\\s\\S]*?src=\"\\/texise-logo\\.png\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 480,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(app, /className=\"texise-brand-logo\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 481,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.doesNotMatch(app, /texise-brand-mark|texise-brand-word/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 482,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-brand-logo/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 483,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.doesNotMatch(css, /\\.texise-brand-mark|\\.texise-brand-word/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 490,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(html, new RegExp(`<link rel=\"preload\" href=\"/texise-fonts/${name.replaceAll('.', '\\\\.')}\"`, 'u'), `missing critical preload for ${name}`);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 493,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.doesNotMatch(html, new RegExp(`<link rel=\"preload\" href=\"/texise-fonts/${name.replaceAll('.', '\\\\.')}\"`, 'u'), `non-critical font should not be preloaded: ${name}`);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 495,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(main, /TEXISE_REQUIRED_FONT_FACES/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 496,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "assert.match(main, /await waitForTeXiseFonts\\(logger\\)/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 498,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(main, /dataset\\.texiseFontsReady = 'true'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 523,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(hero, /TeXise — Privacy First Research/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 529,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(workspace, /texise-hero-editor-layer-source/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 533,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(marketing, /TeXise vs Overleaf/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 536,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-home-hero-v2\\s*\\{/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 537,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-why-card/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 538,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-home-workflow-card/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 539,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-product-comparison/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 540,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-hero-reveal-handle/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 541,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.doesNotMatch(css, /\\.texise-home-hero-glow/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 544,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(workflows, /Explore TeXise/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 545,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "for (const asset of ['/texiser.webp', '/texise-lab.webp', '/texise-research.webp', '/texise-editor.webp']) assert.ok(workflows.includes(asset), `missing workflow asset ${asset}`);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 558,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(app, /<Pencil className=\"size-4\" \\/><span>Rename<\\/span><ChevronRight className=\"texise-menu-trailing/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 563,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "check('product UI uses TeXise page modals instead of browser alert confirm or prompt', async () => {"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 606,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.ok(router.includes('`/texise-media/${kind}/${filename}`'), 'CMS upload URL must stay in the managed /texise-media namespace');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 607,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.ok(router.includes('texise-media\\\\/blog'), 'Blog cover URL validation missing');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 622,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(app, /texise-blog-card-featured/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 624,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-blog-card-featured/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 625,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-blog-grid[\\s\\S]*?grid-template-columns:\\s*repeat\\(3/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 626,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(app, /texise-blog-article-shell/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 629,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-blog-article-hero[\\s\\S]*?aspect-ratio:\\s*2\\.2\\s*\\/\\s*1/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 630,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.doesNotMatch(css, /\\.texise-blog-article-hero::after/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 632,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-blog-article-header > h1[\\s\\S]*?font-family:\\s*var\\(--texise-font-display\\)/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 633,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-blog-article-prose[\\s\\S]*?max-width:\\s*68rem[\\s\\S]*?margin-inline:\\s*auto/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 634,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-blog-article-prose[\\s\\S]*?font-family:\\s*var\\(--texise-font-ui\\)/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 635,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /\\.texise-blog-article-prose pre[\\s\\S]*?var\\(--texise-font-mono\\)/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 636,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(css, /Mobile Docs must override the preceding tablet two-column rule[\\s\\S]*?\\.texise-docs-layout\\s*\\{\\s*grid-template-columns:\\s*minmax\\(0, 1fr\\)/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 641,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 642,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const systemd = await read('deploy/systemd/texise.service');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 643,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(config, /mediaStageRoot: '\\/var\\/www\\/texise\\.com\\/texise-media'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 644,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(config, /mediaPublishedRoot: '\\/var\\/www\\/texise\\.com\\/public_html\\/dist\\/texise-media'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 645,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(config, /blogMediaDir: '\\/var\\/www\\/texise\\.com\\/texise-media\\/blog'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 646,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(config, /docsMediaDir: '\\/var\\/www\\/texise\\.com\\/texise-media\\/docs'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 647,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(config, /aiReviewAuditDb: '\\/var\\/www\\/texise\\.com\\/public_html\\/texise-data\\/audit\\/ai-review-audit\\.sqlite3'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 648,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_DATA_DIR=\"\\$\\{TEXISE_DATA_DIR:-\\$\\{TEXISE_INSTALL_ROOT\\}\\/texise-data\\}\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 649,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_MEDIA_STAGE_ROOT=\"\\$\\{TEXISE_MEDIA_STAGE_ROOT:-\\$\\{TEXISE_SITE_ROOT\\}\\/texise-media\\}\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 650,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_MEDIA_PUBLISHED_ROOT=\"\\$\\{TEXISE_MEDIA_PUBLISHED_ROOT:-\\$\\{TEXISE_DIST_DIR\\}\\/texise-media\\}\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 651,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(deploy, /texise_blog_media_health_check/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 652,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /published_probe_file=\"\\$\\{TEXISE_MEDIA_PUBLISHED_ROOT\\}\\/\\$\\{kind\\}\\/\\$\\{probe_name\\}\"/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 655,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /find \"\\$\\{TEXISE_BLOG_MEDIA_DIR\\}\" -maxdepth 1 -type f[\\s\\S]*-exec chmod 0644/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 656,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /find \"\\$\\{TEXISE_DOCS_MEDIA_DIR\\}\" -maxdepth 1 -type f[\\s\\S]*-exec chmod 0644/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 658,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(systemd, /WorkingDirectory=\\/var\\/www\\/texise\\.com\\/public_html\\/texise-data\\/runtime\\/current\\/server/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 660,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const apache = await read('deploy/apache/texise.com-https.conf');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 661,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.doesNotMatch(apache, /Alias \\/texise-media\\//u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 662,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(apache, /<LocationMatch \"\\^\\/texise-media\\/\\(\\?:blog\\|docs\\)\\//u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 663,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(apache, /<LocationMatch \"\\^\\/\\(\\?:texise-data\\|texise-services\\)/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 668,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "check('production SaaS database default is texise_db with upgrade migration from historical default', async () => {"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 670,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const env = await read('deploy/config/texise.env.example');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 671,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const deploy = await read('scripts/lib/texise-deploy.sh');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 672,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(config, /mysqlDatabase: 'texise_db'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 673,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "assert.match(env, /MYSQL_DATABASE=texise_db/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 674,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "assert.match(deploy, /MYSQL_DATABASE 'texisecom_db' 'texise_db'/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 679,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const env = await read('deploy/config/texise.env.example');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 681,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "const apache = await read('deploy/apache/texise.com-https.conf');"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 686,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(env, /TEXISE_GOOGLE_TAG_ID=/u);"
    },
    {
      "path": "scripts/texise-saas-static-audit.mjs",
      "line": 704,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "else console.log(`PASS all ${checks.length} TeXise SaaS static audits`);"
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 5,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "# shellcheck source=lib/texise-deploy.sh"
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 6,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "source \"${SCRIPT_DIR}/lib/texise-deploy.sh\""
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_root"
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 14,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_die 'Usage: scripts/uninstall.sh [--purge]'"
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "systemctl disable --now texise.service >/dev/null 2>&1 || true"
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 18,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "rm -f \"${TEXISE_SYSTEMD_UNIT}\" /usr/local/bin/texise-license /usr/local/bin/texise-saas"
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "a2dissite app.texise.com.conf >/dev/null 2>&1 || true"
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "rm -f \"${TEXISE_APACHE_SITE}\""
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "rm -rf \"${TEXISE_DIST_DIR}\" \"${TEXISE_INSTALL_ROOT}/dist.next\" \"${TEXISE_PREVIOUS_DIST_DIR}\" \"${TEXISE_RUNTIME_DIR}\""
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "rm -rf \"${TEXISE_CONFIG_DIR}\" \"${TEXISE_DATA_DIR}\" \"${TEXISE_BLOG_MEDIA_ROOT}\""
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 33,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "texise_log 'Removed TeXise runtime, generated browser builds, public_html server data/media, configuration, and signing material.'"
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Removed TeXise runtime and generated browser builds. Preserved ${TEXISE_CONFIG_DIR}.\""
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 36,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Use scripts/uninstall.sh --purge to remove configuration, persistent public_html server data/media, and signing material.'"
    },
    {
      "path": "scripts/uninstall.sh",
      "line": 39,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "texise_log \"Source code was preserved at ${TEXISE_INSTALL_ROOT}. Remove it manually only when you intend to delete the source tree.\""
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 5,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "# shellcheck source=lib/texise-deploy.sh"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 6,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "source \"${SCRIPT_DIR}/lib/texise-deploy.sh\""
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_root"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 10,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_command \"${command_name}\""
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 12,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_node_version"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 13,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_package_manager"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 14,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_require_source_location"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "[[ -d \"${TEXISE_CONFIG_DIR}\" ]] || texise_die 'TeXise is not installed. Run scripts/install.sh first.'"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "texise_log 'Upgrading TeXise in place; /etc/texise and the source tree will be preserved.'"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 19,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_create_service_user"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 20,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_create_directories"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 21,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_prepare_source_permissions"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 22,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_config"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 23,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_signing_keys"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 24,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_normalize_config_permissions"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 25,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_dependencies"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 26,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_build_frontend"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 27,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_prepare_template_runtime_permissions"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 28,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_activate_runtime_server"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 29,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_admin_cli"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 30,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_systemd"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 31,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_install_apache"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 32,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_restart_services"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 33,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_health_check"
    },
    {
      "path": "scripts/upgrade.sh",
      "line": 34,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "texise_log 'Upgrade complete.'"
    },
    {
      "path": "scripts/verify-compiler-profile.mjs",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const profile = (process.env.TEXISE_COMPILER_PROFILE || 'full').trim().toLowerCase();"
    },
    {
      "path": "scripts/verify-compiler-profile.mjs",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "throw new Error(`Unsupported TEXISE_COMPILER_PROFILE=${profile}`);"
    },
    {
      "path": "scripts/verify-compiler-profile.mjs",
      "line": 65,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "`[TeXise] Compiler profile verified: ${profile}; engines=` +"
    },
    {
      "path": "scripts/verify-ollama-local.mjs",
      "line": 3,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const rawBaseUrl = String(process.env.TEXISE_OLLAMA_BASE_URL || 'http://localhost:11434').trim();"
    },
    {
      "path": "scripts/verify-ollama-local.mjs",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const requestedModel = String(process.env.TEXISE_OLLAMA_MODEL || '').trim();"
    },
    {
      "path": "scripts/verify-ollama-local.mjs",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const timeoutMs = Number(process.env.TEXISE_OLLAMA_TIMEOUT_MS || 120_000);"
    },
    {
      "path": "scripts/verify-ollama-local.mjs",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error(`[TeXise Ollama] ERROR: ${message}`);"
    },
    {
      "path": "scripts/verify-ollama-local.mjs",
      "line": 14,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "try { parsed = new URL(value); } catch { fail(`Invalid TEXISE_OLLAMA_BASE_URL: ${value}`); }"
    },
    {
      "path": "scripts/verify-ollama-local.mjs",
      "line": 46,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise Ollama] Checking ${baseUrl}`);"
    },
    {
      "path": "scripts/verify-ollama-local.mjs",
      "line": 49,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise Ollama] Ollama ${String(version?.version || 'unknown version')} detected.`);"
    },
    {
      "path": "scripts/verify-ollama-local.mjs",
      "line": 64,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise Ollama] Selected verified-local model: ${selectedModel}`);"
    },
    {
      "path": "scripts/verify-ollama-local.mjs",
      "line": 91,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise Ollama] PASS local completion (${reply.length} characters returned).`);"
    },
    {
      "path": "scripts/verify-ollama-local.mjs",
      "line": 92,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log('[TeXise Ollama] Real local Ollama smoke certification passed.');"
    },
    {
      "path": "scripts/verify-production-deployment.mjs",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const baseUrl = new URL(process.env.TEXISE_DEPLOY_URL || 'https://www.texise.com');"
    },
    {
      "path": "scripts/verify-production-deployment.mjs",
      "line": 5,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const reportPath = process.env.TEXISE_DEPLOY_SMOKE_REPORT || 'production-smoke-report.json';"
    },
    {
      "path": "scripts/verify-production-deployment.mjs",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise deploy smoke] ${passed ? 'PASS' : 'FAIL'} ${name}: ${details}`);"
    },
    {
      "path": "scripts/verify-production-deployment.mjs",
      "line": 91,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "product: 'TeXise',"
    },
    {
      "path": "scripts/verify-production-deployment.mjs",
      "line": 99,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.log(`[TeXise deploy smoke] Report written to ${reportPath}.`);"
    },
    {
      "path": "scripts/verify-public-seo-production.sh",
      "line": 4,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "BASE_URL=\"${1:-${TEXISE_PUBLIC_URL:-https://www.texise.com}}\""
    },
    {
      "path": "scripts/verify-public-seo-production.sh",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "log() { printf '[TeXise SEO] %s\\n' \"$*\"; }"
    },
    {
      "path": "scripts/verify-public-seo-production.sh",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "fail() { printf '[TeXise SEO] ERROR: %s\\n' \"$*\" >&2; exit 1; }"
    },
    {
      "path": "scripts/verify-public-seo-production.sh",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "--user-agent 'TeXiseProductionSeoVerifier/1.0' \\"
    },
    {
      "path": "scripts/verify-public-seo-production.sh",
      "line": 81,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "curl --silent --show-error --max-time 20 --head --user-agent 'TeXiseProductionSeoVerifier/1.0' \"${BASE_URL}${path}\" > \"${headers}\""
    },
    {
      "path": "scripts/verify-public-seo-production.sh",
      "line": 111,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "verify_html '/compare' compare 'data-texise-prerender=\"compare-hub\"'"
    },
    {
      "path": "scripts/verify-public-seo-production.sh",
      "line": 112,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "verify_html '/change-log' change-log 'data-texise-prerender=\"change-log\"'"
    },
    {
      "path": "scripts/verify-public-seo-production.sh",
      "line": 119,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "verify_html \"${path}\" \"${slug}\" 'data-texise-prerender=\"compare-'"
    },
    {
      "path": "scripts/verify-template-compiler-requirements.mjs",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const templateRoot = path.join(root, 'texise-templates');"
    },
    {
      "path": "scripts/verify-template-compiler-requirements.mjs",
      "line": 56,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "`[TeXise] Template compiler requirements: ${requirements.size - missing.length}/${requirements.size} bundled` +"
    },
    {
      "path": "scripts/verify-texise-branding.mjs",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "// Required compiler distribution endpoints/package names retained until TeXise hosts equivalent assets."
    },
    {
      "path": "scripts/verify-texise-branding.mjs",
      "line": 35,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "['deploy/config/texise.env.example', /texlyre-busytex|texlive2026\\.texlyre\\.org/u],"
    },
    {
      "path": "scripts/verify-texise-branding.mjs",
      "line": 88,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "'docs/texise-release-checklist.md',"
    },
    {
      "path": "scripts/verify-texise-branding.mjs",
      "line": 89,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'docs/TEXISE_SAAS_IMPLEMENTATION_LEDGER.md',"
    },
    {
      "path": "scripts/verify-texise-branding.mjs",
      "line": 90,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'docs/TEXISE_SAAS_VALIDATION_REPORT.md',"
    },
    {
      "path": "scripts/verify-texise-branding.mjs",
      "line": 107,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "if (/\\bTeXise\\b/u.test(source)) violations.push(`${file}: active product surface still contains TeXise naming`);"
    },
    {
      "path": "scripts/verify-workspace-dependency-versions.mjs",
      "line": 61,
      "category": "compatibility-migration",
      "rationale": "deployment/release compatibility identifier",
      "text": "console.error('The same dependency must use one package.json specifier across TeXise workspace packages.');"
    },
    {
      "path": "scripts/visual-editor-recovery-regression.test.mjs",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('packages/js-lib/latex-visual/src/native-texise-editor.ts'),"
    },
    {
      "path": "scripts/visual-editor-recovery-regression.test.mjs",
      "line": 48,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(visualReact, /texise-asset-error:/u);"
    },
    {
      "path": "scripts/visual-editor-recovery-regression.test.mjs",
      "line": 64,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-latex-visual-editor \\{[\\s\\S]*isolation: isolate;[\\s\\S]*z-index: 0;/u);"
    },
    {
      "path": "scripts/visual-editor-recovery-regression.test.mjs",
      "line": 65,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-visual-raw-block\\.ProseMirror-selectednode[\\s\\S]*z-index: 0;/u);"
    },
    {
      "path": "scripts/visual-long-document-protected-regression.test.mjs",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-latex-visual-editor > \\* \\{[\\s\\S]*?flex-shrink:\\s*0;[\\s\\S]*?min-width:\\s*0;/u);"
    },
    {
      "path": "scripts/visual-long-document-protected-regression.test.mjs",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-latex-visual-editor \\.texise-visual-raw-block \\{[\\s\\S]*?flex:\\s*0 0 auto;[\\s\\S]*?min-height:\\s*3rem;[\\s\\S]*?content-visibility:\\s*visible;/u);"
    },
    {
      "path": "scripts/visual-long-document-protected-regression.test.mjs",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(css, /\\.texise-latex-visual-editor \\.texise-visual-protected-source \\{[\\s\\S]*?display:\\s*block;[\\s\\S]*?min-height:\\s*2\\.25rem;/u);"
    },
    {
      "path": "server/abuse-controls-config.node.test.mjs",
      "line": 18,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('Learnitive abuse-control env names override deprecated TEXISE fallbacks', () => {"
    },
    {
      "path": "server/abuse-controls-config.node.test.mjs",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_API_MUTATION_RATE_PER_MINUTE: '99',"
    },
    {
      "path": "server/abuse-controls-config.node.test.mjs",
      "line": 37,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "test('deprecated TEXISE abuse-control names remain compatibility fallbacks', () => {"
    },
    {
      "path": "server/abuse-controls-config.node.test.mjs",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_API_MUTATION_RATE_PER_MINUTE: '111',"
    },
    {
      "path": "server/abuse-controls-config.node.test.mjs",
      "line": 41,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_RATE_BUCKET_CAP: '2222',"
    },
    {
      "path": "server/abuse-controls-deploy.node.test.mjs",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('scripts/lib/texise-deploy.sh'),"
    },
    {
      "path": "server/abuse-controls-deploy.node.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('texise-services/console-gateway/server.js'),"
    },
    {
      "path": "server/abuse-controls-deploy.node.test.mjs",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(deploy, /TEXISE_CONSOLE_GATEWAY_SECRET/u, 'legacy secret remains synchronized during migration');"
    },
    {
      "path": "server/abuse-controls-deploy.node.test.mjs",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('texise-services/cloud-compile/server.js'),"
    },
    {
      "path": "server/abuse-controls-deploy.node.test.mjs",
      "line": 35,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "read('texise-services/console-gateway/server.js'),"
    },
    {
      "path": "server/admin-identity-migration.node.test.mjs",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(source, /LEGACY_ADMIN_EMAIL = 'admin@texise\\.com'/u);"
    },
    {
      "path": "server/ai-byok-config.node.test.mjs",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_PUBLIC_URL: 'https://www.texise.com',"
    },
    {
      "path": "server/ai-byok-config.node.test.mjs",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SAAS_ENABLED: '0',"
    },
    {
      "path": "server/ai-byok-config.node.test.mjs",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_AI_REVIEW_OPENAI_API_KEY: 'sk-admin-review-sentinel',"
    },
    {
      "path": "server/ai-review-quota.mjs",
      "line": 22,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "return createHash('sha256').update(`texise-ai-review:${payload.licenseFingerprint}`).digest('hex');"
    },
    {
      "path": "server/ai-review-quota.mjs",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "const dbPath = options.dbPath ?? config.aiReviewAuditDb ?? '/var/www/texise.com/public_html/texise-data/audit/ai-review-audit.sqlite3';"
    },
    {
      "path": "server/ai-review-quota.spec.mjs",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = mkdtempSync(join(tmpdir(), 'texise-review-'));"
    },
    {
      "path": "server/ai-suggest-review-panel.node.test.mjs",
      "line": 30,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(service, /const CLOUD_CREDENTIAL_DB = 'texise-ai-credentials-v1'/u);"
    },
    {
      "path": "server/ai-suggest-review-panel.node.test.mjs",
      "line": 50,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(writing, /Never output \\[TEXISE_END\\]/u);"
    },
    {
      "path": "server/analytics-config.node.test.mjs",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_PUBLIC_URL: 'https://www.texise.com',"
    },
    {
      "path": "server/analytics-config.node.test.mjs",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SAAS_ENABLED: '0',"
    },
    {
      "path": "server/analytics-config.node.test.mjs",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.equal(loadTexiseConfig({ ...base, TEXISE_GOOGLE_TAG_ID: 'G-ABC123XYZ' }).googleTagId, 'G-ABC123XYZ');"
    },
    {
      "path": "server/analytics-config.node.test.mjs",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.equal(loadTexiseConfig({ ...base, TEXISE_GOOGLE_TAG_ID: 'GT-ABC123XYZ' }).googleTagId, 'GT-ABC123XYZ');"
    },
    {
      "path": "server/analytics-config.node.test.mjs",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "() => loadTexiseConfig({ ...base, TEXISE_GOOGLE_TAG_ID: 'not-a-google-tag' }),"
    },
    {
      "path": "server/analytics-config.node.test.mjs",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "/Invalid TEXISE_GOOGLE_TAG_ID/u,"
    },
    {
      "path": "server/blog-media.node.test.mjs",
      "line": 69,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const boundary = '----texiseBlogBoundary';"
    },
    {
      "path": "server/blog-media.node.test.mjs",
      "line": 85,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const root = await mkdtemp(join(tmpdir(), 'texise-blog-media-umask-'));"
    },
    {
      "path": "server/blog-media.node.test.mjs",
      "line": 99,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const root = await mkdtemp(join(tmpdir(), 'texise-blog-media-'));"
    },
    {
      "path": "server/blog-media.node.test.mjs",
      "line": 115,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const root = await mkdtemp(join(tmpdir(), 'texise-cms-media-dual-'));"
    },
    {
      "path": "server/blog-media.node.test.mjs",
      "line": 148,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const root = await mkdtemp(join(tmpdir(), 'texise-cms-media-legacy-'));"
    },
    {
      "path": "server/cloud-compile.node.test.mjs",
      "line": 76,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(path.join(os.tmpdir(), 'texise-cloud-quota-'));"
    },
    {
      "path": "server/cloud-compile.node.test.mjs",
      "line": 112,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(path.join(os.tmpdir(), 'texise-cloud-admin-'));"
    },
    {
      "path": "server/cloud-compile.node.test.mjs",
      "line": 161,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(path.join(os.tmpdir(), 'texise-cloud-pro-'));"
    },
    {
      "path": "server/cloud-compile.node.test.mjs",
      "line": 205,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(path.join(os.tmpdir(), 'texise-cloud-free-universal-'));"
    },
    {
      "path": "server/cloud-compile.node.test.mjs",
      "line": 243,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(path.join(os.tmpdir(), 'texise-cloud-anon-fallback-'));"
    },
    {
      "path": "server/cloud-compile.node.test.mjs",
      "line": 286,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(path.join(os.tmpdir(), 'texise-cloud-anon-manual-'));"
    },
    {
      "path": "server/cloud-compile.node.test.mjs",
      "line": 302,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const dir = await mkdtemp(path.join(os.tmpdir(), 'texise-cloud-fallback-only-'));"
    },
    {
      "path": "server/collaboration-host-grant.mjs",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return createHmac('sha256', secret).update(`texise-collaboration-host-v${COLLABORATION_HOST_GRANT_VERSION}.${encodedPayload}`).digest('base64url');"
    },
    {
      "path": "server/config.mjs",
      "line": 34,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "function parsePort(value, name = 'TEXISE_PORT') {"
    },
    {
      "path": "server/config.mjs",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "console.warn(`[Learnitive] Invalid TEXISE_FREE_PLAN_LIMIT=${String(value)}; using ${DEFAULT_FREE_PROJECT_LIMIT}.`);"
    },
    {
      "path": "server/config.mjs",
      "line": 95,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "throw new Error(`Invalid TEXISE_GOOGLE_TAG_ID: ${normalized}`);"
    },
    {
      "path": "server/config.mjs",
      "line": 189,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (!/^\\d+$/u.test(String(value))) throw new Error(`Invalid TEXISE_SESSION_DAYS: ${value}`);"
    },
    {
      "path": "server/config.mjs",
      "line": 191,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (!Number.isInteger(days) || days < 1 || days > 365) throw new Error(`Invalid TEXISE_SESSION_DAYS: ${value}`);"
    },
    {
      "path": "server/config.mjs",
      "line": 199,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const explicitlyEnabled = (env.LEARNITIVE_SAAS_ENABLED || env.TEXISE_SAAS_ENABLED) === '1';"
    },
    {
      "path": "server/config.mjs",
      "line": 201,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.LEARNITIVE_MYSQL_CREATE_DATABASE || env.TEXISE_MYSQL_CREATE_DATABASE,"
    },
    {
      "path": "server/config.mjs",
      "line": 234,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "sessionDays: parseSessionDays(env.LEARNITIVE_SESSION_DAYS || env.TEXISE_SESSION_DAYS),"
    },
    {
      "path": "server/config.mjs",
      "line": 241,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "mediaStageRoot: env.LEARNITIVE_MEDIA_STAGE_ROOT || env.TEXISE_MEDIA_STAGE_ROOT || DEFAULTS.mediaStageRoot,"
    },
    {
      "path": "server/config.mjs",
      "line": 242,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "mediaPublishedRoot: env.LEARNITIVE_MEDIA_PUBLISHED_ROOT || env.TEXISE_MEDIA_PUBLISHED_ROOT || DEFAULTS.mediaPublishedRoot,"
    },
    {
      "path": "server/config.mjs",
      "line": 243,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "blogMediaDir: env.LEARNITIVE_BLOG_MEDIA_DIR || env.TEXISE_BLOG_MEDIA_DIR || DEFAULTS.blogMediaDir,"
    },
    {
      "path": "server/config.mjs",
      "line": 244,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "docsMediaDir: env.LEARNITIVE_DOCS_MEDIA_DIR || env.TEXISE_DOCS_MEDIA_DIR || DEFAULTS.docsMediaDir,"
    },
    {
      "path": "server/config.mjs",
      "line": 328,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.LEARNITIVE_PUBLIC_URL || env.TEXISE_PUBLIC_URL || fileConfig.publicUrl || DEFAULTS.publicUrl,"
    },
    {
      "path": "server/config.mjs",
      "line": 332,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env: env.LEARNITIVE_ENV || env.TEXISE_ENV || 'production',"
    },
    {
      "path": "server/config.mjs",
      "line": 333,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "releaseId: env.LEARNITIVE_RELEASE_ID || env.TEXISE_RELEASE_ID || 'development',"
    },
    {
      "path": "server/config.mjs",
      "line": 335,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "host: env.LEARNITIVE_HOST || env.TEXISE_HOST || DEFAULTS.host,"
    },
    {
      "path": "server/config.mjs",
      "line": 336,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "port: parsePort(env.LEARNITIVE_PORT || env.TEXISE_PORT, 'LEARNITIVE_PORT'),"
    },
    {
      "path": "server/config.mjs",
      "line": 337,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "signalingPort: parsePort(env.LEARNITIVE_SIGNALING_PORT || env.TEXISE_SIGNALING_PORT || String(DEFAULTS.signalingPort), 'LEARNITIVE_SIGNALING_PORT'),"
    },
    {
      "path": "server/config.mjs",
      "line": 338,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "configFile: env.LEARNITIVE_CONFIG_FILE || env.TEXISE_CONFIG_FILE || DEFAULTS.configFile,"
    },
    {
      "path": "server/config.mjs",
      "line": 340,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "env.LEARNITIVE_LICENSE_KEYS_FILE || env.TEXISE_LICENSE_KEYS_FILE || DEFAULTS.licenseKeysFile,"
    },
    {
      "path": "server/config.mjs",
      "line": 342,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.LEARNITIVE_ENTITLEMENT_PRIVATE_KEY || env.TEXISE_ENTITLEMENT_PRIVATE_KEY ||"
    },
    {
      "path": "server/config.mjs",
      "line": 345,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.LEARNITIVE_ENTITLEMENT_PUBLIC_KEY || env.TEXISE_ENTITLEMENT_PUBLIC_KEY ||"
    },
    {
      "path": "server/config.mjs",
      "line": 348,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.LEARNITIVE_ENTITLEMENT_REFRESH_KEY || env.TEXISE_ENTITLEMENT_REFRESH_KEY ||"
    },
    {
      "path": "server/config.mjs",
      "line": 350,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "aiReviewAuditDb: env.LEARNITIVE_AI_REVIEW_AUDIT_DB || env.TEXISE_AI_REVIEW_AUDIT_DB || DEFAULTS.aiReviewAuditDb,"
    },
    {
      "path": "server/config.mjs",
      "line": 351,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "webRoot: env.LEARNITIVE_WEB_ROOT || env.TEXISE_WEB_ROOT || DEFAULTS.webRoot,"
    },
    {
      "path": "server/config.mjs",
      "line": 354,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.LEARNITIVE_FREE_ACCOUNT_PROJECT_METADATA_LIMIT || env.TEXISE_FREE_PLAN_LIMIT,"
    },
    {
      "path": "server/config.mjs",
      "line": 358,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.LEARNITIVE_FREE_ACCOUNT_PROJECT_METADATA_LIMIT || env.TEXISE_FREE_PLAN_LIMIT,"
    },
    {
      "path": "server/config.mjs",
      "line": 362,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "secret: env.LEARNITIVE_RUNNER_SECRET || env.TEXISE_COMPILE_SHARED_SECRET || '',"
    },
    {
      "path": "server/config.mjs",
      "line": 384,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.LEARNITIVE_API_MUTATION_RATE_PER_MINUTE || env.TEXISE_API_MUTATION_RATE_PER_MINUTE,"
    },
    {
      "path": "server/config.mjs",
      "line": 391,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.LEARNITIVE_CONTACT_RATE_PER_HOUR || env.TEXISE_CONTACT_RATE_PER_HOUR,"
    },
    {
      "path": "server/config.mjs",
      "line": 398,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.LEARNITIVE_ADMIN_LOGIN_RATE_PER_15_MIN || env.TEXISE_ADMIN_LOGIN_RATE_PER_15_MIN,"
    },
    {
      "path": "server/config.mjs",
      "line": 405,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "env.LEARNITIVE_LICENSE_VERIFY_RATE_PER_15_MIN || env.TEXISE_LICENSE_VERIFY_RATE_PER_15_MIN,"
    },
    {
      "path": "server/config.mjs",
      "line": 412,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "env.LEARNITIVE_LICENSE_ACTIVATION_RATE_PER_15_MIN || env.TEXISE_LICENSE_ACTIVATION_RATE_PER_15_MIN,"
    },
    {
      "path": "server/config.mjs",
      "line": 419,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.LEARNITIVE_RATE_BUCKET_CAP || env.TEXISE_RATE_BUCKET_CAP,"
    },
    {
      "path": "server/config.mjs",
      "line": 428,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "enabled: parseEnvBoolean(env.LEARNITIVE_CLOUD_COMPILE_ENABLED || env.TEXISE_CLOUD_COMPILE_ENABLED, false, 'LEARNITIVE_CLOUD_COMPILE_ENABLED'),"
    },
    {
      "path": "server/config.mjs",
      "line": 429,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "allowedEngines: Object.freeze(parseCloudEngines(env.LEARNITIVE_CLOUD_COMPILE_ALLOWED_ENGINES || env.TEXISE_CLOUD_COMPILE_ALLOWED_ENGINES)),"
    },
    {
      "path": "server/config.mjs",
      "line": 430,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "maxFiles: parseBoundedInteger(env.LEARNITIVE_CLOUD_COMPILE_MAX_FILES || env.TEXISE_CLOUD_COMPILE_MAX_FILES, 450, 'LEARNITIVE_CLOUD_COMPILE_MAX_FILES', 1, 2000),"
    },
    {
      "path": "server/config.mjs",
      "line": 431,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "maxProjectBytes: parseBoundedInteger(env.LEARNITIVE_CLOUD_COMPILE_MAX_PROJECT_BYTES || env.TEXISE_CLOUD_COMPILE_MAX_PROJECT_BYTES, 25_000_000, 'LEARNITIVE_CLOUD_COMPILE_MAX_PROJECT_BYTES', 1024, 500_000_000),"
    },
    {
      "path": "server/config.mjs",
      "line": 432,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "maxCompileSeconds: parseBoundedInteger(env.LEARNITIVE_CLOUD_COMPILE_MAX_SECONDS || env.TEXISE_CLOUD_COMPILE_MAX_SECONDS, 120, 'LEARNITIVE_CLOUD_COMPILE_MAX_SECONDS', 1, 900),"
    },
    {
      "path": "server/config.mjs",
      "line": 433,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "maxOutputBytes: parseBoundedInteger(env.LEARNITIVE_CLOUD_COMPILE_MAX_OUTPUT_BYTES || env.TEXISE_CLOUD_COMPILE_MAX_OUTPUT_BYTES, 60_000_000, 'LEARNITIVE_CLOUD_COMPILE_MAX_OUTPUT_BYTES', 1024, 500_000_000),"
    },
    {
      "path": "server/config.mjs",
      "line": 434,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "concurrency: parseBoundedInteger(env.LEARNITIVE_CLOUD_COMPILE_CONCURRENCY || env.TEXISE_CLOUD_COMPILE_CONCURRENCY, 2, 'LEARNITIVE_CLOUD_COMPILE_CONCURRENCY', 1, 64),"
    },
    {
      "path": "server/config.mjs",
      "line": 435,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "dailyAllowance: parseBoundedInteger(env.LEARNITIVE_CLOUD_COMPILE_DAILY_ALLOWANCE || env.TEXISE_CLOUD_COMPILE_DAILY_ALLOWANCE, 0, 'LEARNITIVE_CLOUD_COMPILE_DAILY_ALLOWANCE', 0, 100000),"
    },
    {
      "path": "server/config.mjs",
      "line": 436,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "monthlyAllowance: parseBoundedInteger(env.LEARNITIVE_CLOUD_COMPILE_MONTHLY_ALLOWANCE || env.TEXISE_CLOUD_COMPILE_MONTHLY_ALLOWANCE, 0, 'LEARNITIVE_CLOUD_COMPILE_MONTHLY_ALLOWANCE', 0, 1000000),"
    },
    {
      "path": "server/config.mjs",
      "line": 437,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "freeFallbackEnabled: parseEnvBoolean(env.LEARNITIVE_CLOUD_COMPILE_FREE_FALLBACK || env.TEXISE_CLOUD_COMPILE_FREE_FALLBACK, true, 'LEARNITIVE_CLOUD_COMPILE_FREE_FALLBACK'),"
    },
    {
      "path": "server/config.mjs",
      "line": 438,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "workerUrl: env.LEARNITIVE_CLOUD_COMPILE_WORKER_URL || env.TEXISE_CLOUD_COMPILE_WORKER_URL || DEFAULTS.cloudCompileWorkerUrl,"
    },
    {
      "path": "server/config.mjs",
      "line": 439,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "workerSecret: env.LEARNITIVE_CLOUD_COMPILE_WORKER_SECRET || env.TEXISE_CLOUD_COMPILE_WORKER_SECRET || '',"
    },
    {
      "path": "server/config.mjs",
      "line": 440,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "auditFile: env.LEARNITIVE_CLOUD_COMPILE_AUDIT_FILE || env.TEXISE_CLOUD_COMPILE_AUDIT_FILE || DEFAULTS.cloudCompileAuditFile,"
    },
    {
      "path": "server/config.mjs",
      "line": 448,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "enabled: parseEnvBoolean(env.LEARNITIVE_LINUX_TERMINAL_ENABLED || env.TEXISE_LINUX_TERMINAL_ENABLED, false, 'LEARNITIVE_LINUX_TERMINAL_ENABLED'),"
    },
    {
      "path": "server/config.mjs",
      "line": 449,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "gatewayUrl: env.LEARNITIVE_CONSOLE_GATEWAY_URL || env.TEXISE_CONSOLE_GATEWAY_URL || DEFAULTS.consoleGatewayUrl,"
    },
    {
      "path": "server/config.mjs",
      "line": 450,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "gatewaySecret: env.LEARNITIVE_CONSOLE_GATEWAY_SECRET || env.TEXISE_CONSOLE_GATEWAY_SECRET || '',"
    },
    {
      "path": "server/config.mjs",
      "line": 451,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "executionImage: env.LEARNITIVE_CONSOLE_IMAGE || env.TEXISE_CONSOLE_IMAGE || DEFAULTS.consoleImage,"
    },
    {
      "path": "server/config.mjs",
      "line": 452,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "maxProjectBytes: parseBoundedInteger(env.LEARNITIVE_CONSOLE_LEGACY_UPLOAD_REQUEST_BYTES || env.LEARNITIVE_CONSOLE_MAX_UPLOAD_BYTES || env.TEXISE_CONSOLE_MAX_UPLOAD_BYTES, 50_000_000, 'LEARNITIVE_CONSOLE_LEGACY_UPLOAD_REQUEST_BYTES', 1024, 500_000_000),"
    },
    {
      "path": "server/config.mjs",
      "line": 453,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "maxDownloadBytes: parseBoundedInteger(env.LEARNITIVE_CONSOLE_BUFFERED_DOWNLOAD_BYTES || env.LEARNITIVE_CONSOLE_MAX_DOWNLOAD_BYTES || env.TEXISE_CONSOLE_MAX_DOWNLOAD_BYTES, 100_000_000, 'LEARNITIVE_CONSOLE_BUFFERED_DOWNLOAD_BYTES', 1024, 1_000_000_000),"
    },
    {
      "path": "server/config.mjs",
      "line": 454,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "sessionMinutes: parseBoundedInteger(env.LEARNITIVE_CONSOLE_SESSION_MINUTES || env.TEXISE_CONSOLE_SESSION_MINUTES, 240, 'LEARNITIVE_CONSOLE_SESSION_MINUTES', 5, 1440),"
    },
    {
      "path": "server/config.mjs",
      "line": 460,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "openaiModel: env.TEXISE_AI_REVIEW_OPENAI_MODEL || env.OPENAI_MODEL || 'gpt-4.1-mini',"
    },
    {
      "path": "server/config.mjs",
      "line": 465,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.PAYHIP_MONTHLY_PRODUCT_SECRET_KEY || env.TEXISE_PRO_MONTHLY_PRODUCT_SECRET_KEY || '',"
    },
    {
      "path": "server/config.mjs",
      "line": 466,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "googleTagId: parseOptionalGoogleTagId(env.TEXISE_GOOGLE_TAG_ID),"
    },
    {
      "path": "server/config.mjs",
      "line": 467,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "lifetimePrice: String(env.TEXISE_LIFETIME_PRICE || '').trim().slice(0, 64),"
    },
    {
      "path": "server/config.mjs",
      "line": 468,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "// TEXISE_SHOP is a public checkout URL. Payhip's verification API returns"
    },
    {
      "path": "server/config.mjs",
      "line": 472,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.TEXISE_SHOP || optionalHttpUrl(env.PAYHIP_PRODUCT_LINK || env.PAYHIP_PRODUCT_ID || ''),"
    },
    {
      "path": "server/config.mjs",
      "line": 473,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_SHOP',"
    },
    {
      "path": "server/config.mjs",
      "line": 476,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.PAYHIP_PRODUCT_LINK || env.PAYHIP_PRODUCT_ID || env.TEXISE_SHOP || '',"
    },
    {
      "path": "server/config.mjs",
      "line": 481,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.TEXISE_PRO_MONTHLY_SHOP ||"
    },
    {
      "path": "server/config.mjs",
      "line": 485,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "env.TEXISE_PRO_MONTHLY_SHOP ||"
    },
    {
      "path": "server/config.mjs",
      "line": 487,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TEXISE_PRO_MONTHLY_SHOP',"
    },
    {
      "path": "server/config.mjs",
      "line": 491,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "env.TEXISE_LICENSE_REFRESH_DAYS,"
    },
    {
      "path": "server/config.mjs",
      "line": 493,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "'TEXISE_LICENSE_REFRESH_DAYS',"
    },
    {
      "path": "server/config.mjs",
      "line": 496,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "env.TEXISE_LICENSE_OFFLINE_GRACE_DAYS,"
    },
    {
      "path": "server/config.mjs",
      "line": 498,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "'TEXISE_LICENSE_OFFLINE_GRACE_DAYS',"
    },
    {
      "path": "server/config.mjs",
      "line": 509,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "openAlexEnabled: env.TEXISE_SCHOLAR_OPENALEX !== '0',"
    },
    {
      "path": "server/config.mjs",
      "line": 510,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "crossrefEnabled: env.TEXISE_SCHOLAR_CROSSREF !== '0',"
    },
    {
      "path": "server/config.mjs",
      "line": 511,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "europePmcEnabled: env.TEXISE_SCHOLAR_EUROPE_PMC !== '0',"
    },
    {
      "path": "server/config.mjs",
      "line": 512,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "pubmedEnabled: env.TEXISE_SCHOLAR_PUBMED !== '0',"
    },
    {
      "path": "server/config.mjs",
      "line": 513,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "arxivEnabled: env.TEXISE_SCHOLAR_ARXIV !== '0',"
    },
    {
      "path": "server/config.mjs",
      "line": 514,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "openaireEnabled: env.TEXISE_SCHOLAR_OPENAIRE !== '0',"
    },
    {
      "path": "server/config.mjs",
      "line": 515,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "dataciteEnabled: env.TEXISE_SCHOLAR_DATACITE !== '0',"
    },
    {
      "path": "server/config.mjs",
      "line": 516,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "doajEnabled: env.TEXISE_SCHOLAR_DOAJ !== '0',"
    },
    {
      "path": "server/config.mjs",
      "line": 517,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "semanticScholarEnabled: env.TEXISE_SCHOLAR_SEMANTIC_SCHOLAR !== '0',"
    },
    {
      "path": "server/config.mjs",
      "line": 529,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const configFile = env.LEARNITIVE_CONFIG_FILE || env.TEXISE_CONFIG_FILE || DEFAULTS.configFile;"
    },
    {
      "path": "server/config.mjs",
      "line": 576,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "throw new Error('TEXISE_LINUX_TERMINAL_ENABLED requires TEXISE_SAAS_ENABLED because TexLab requires an authenticated account.');"
    },
    {
      "path": "server/config.mjs",
      "line": 579,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "throw new Error('TEXISE_CONSOLE_GATEWAY_SECRET is required when TexLab is enabled.');"
    },
    {
      "path": "server/config.mjs",
      "line": 584,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export { DEFAULTS as TEXISE_CONFIG_DEFAULTS };"
    },
    {
      "path": "server/free-plan-project-limit.node.test.mjs",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_PUBLIC_URL: 'https://www.texise.com',"
    },
    {
      "path": "server/free-plan-project-limit.node.test.mjs",
      "line": 7,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SAAS_ENABLED: '0',"
    },
    {
      "path": "server/free-plan-project-limit.node.test.mjs",
      "line": 12,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.equal(loadTexiseConfig({ ...base, TEXISE_FREE_PLAN_LIMIT: '3' }).freePlanProjectLimit, 3);"
    },
    {
      "path": "server/free-plan-project-limit.node.test.mjs",
      "line": 13,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.equal(loadTexiseConfig({ ...base, TEXISE_FREE_PLAN_LIMIT: '12' }).freePlanProjectLimit, 12);"
    },
    {
      "path": "server/free-plan-project-limit.node.test.mjs",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.equal(loadTexiseConfig({ ...base, TEXISE_FREE_PLAN_LIMIT: value }).freePlanProjectLimit, 5);"
    },
    {
      "path": "server/license-monthly.node.test.mjs",
      "line": 11,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "const directory = await mkdtemp(join(tmpdir(), 'texise-license-monthly-'));"
    },
    {
      "path": "server/license-monthly.node.test.mjs",
      "line": 22,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TEXISE_LICENSE_KEYS_FILE: licensePath,"
    },
    {
      "path": "server/license-monthly.node.test.mjs",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_PRIVATE_KEY: privatePath,"
    },
    {
      "path": "server/license-monthly.node.test.mjs",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_PUBLIC_KEY: publicPath,"
    },
    {
      "path": "server/license-monthly.node.test.mjs",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_REFRESH_KEY: refreshPath,"
    },
    {
      "path": "server/license-monthly.node.test.mjs",
      "line": 26,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TEXISE_LICENSE_REFRESH_DAYS: '7',"
    },
    {
      "path": "server/license-monthly.node.test.mjs",
      "line": 27,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TEXISE_LICENSE_OFFLINE_GRACE_DAYS: '90',"
    },
    {
      "path": "server/license.mjs",
      "line": 14,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const TOKEN_PREFIX = 'texise1';"
    },
    {
      "path": "server/license.spec.mjs",
      "line": 14,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "const directory = await mkdtemp(join(tmpdir(), 'texise-license-'));"
    },
    {
      "path": "server/license.spec.mjs",
      "line": 25,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TEXISE_LICENSE_KEYS_FILE: licensePath,"
    },
    {
      "path": "server/license.spec.mjs",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_PRIVATE_KEY: privatePath,"
    },
    {
      "path": "server/license.spec.mjs",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_PUBLIC_KEY: publicPath,"
    },
    {
      "path": "server/license.spec.mjs",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_REFRESH_KEY: refreshPath,"
    },
    {
      "path": "server/license.spec.mjs",
      "line": 29,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TEXISE_LICENSE_REFRESH_DAYS: '30',"
    },
    {
      "path": "server/license.spec.mjs",
      "line": 30,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TEXISE_LICENSE_OFFLINE_GRACE_DAYS: '90',"
    },
    {
      "path": "server/license.spec.mjs",
      "line": 36,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('TeXise licensing', () => {"
    },
    {
      "path": "server/license.spec.mjs",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const key = 'texise-pro-test-1234';"
    },
    {
      "path": "server/local-first-project-policy.node.test.mjs",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const base = { TEXISE_SESSION_SECRET:'x'.repeat(32), TEXISE_DB_PASSWORD:'x', TEXISE_PUBLIC_URL:'https://learnitive.test' };"
    },
    {
      "path": "server/local-first-project-policy.node.test.mjs",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.equal(loadTexiseConfig({ ...base, TEXISE_FREE_PLAN_LIMIT:'7' }).freeAccountProjectMetadataLimit, 7);"
    },
    {
      "path": "server/local-first-project-policy.node.test.mjs",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.equal(loadTexiseConfig({ ...base, TEXISE_FREE_PLAN_LIMIT:'7', LEARNITIVE_FREE_ACCOUNT_PROJECT_METADATA_LIMIT:'3' }).freeAccountProjectMetadataLimit, 3);"
    },
    {
      "path": "server/product-identity.mjs",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return env.LEARNITIVE_PUBLIC_URL || env.TEXISE_PUBLIC_URL || PRODUCT_IDENTITY.origin;"
    },
    {
      "path": "server/prune-removed-bundled-templates.mjs",
      "line": 58,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const root = arg('root', process.env.LEARNITIVE_TEMPLATE_ROOT || 'texise-templates');"
    },
    {
      "path": "server/public-index.mjs",
      "line": 82,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const raw = await readFileImpl(join(config.webRoot, 'texise-templates', 'templates.json'), 'utf8');"
    },
    {
      "path": "server/public-index.mjs",
      "line": 101,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "readFileImpl(join(config.webRoot, 'texise-templates', 'categories.json'), 'utf8'),"
    },
    {
      "path": "server/public-index.mjs",
      "line": 102,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "readFileImpl(join(config.webRoot, 'texise-templates', 'templates.json'), 'utf8'),"
    },
    {
      "path": "server/public-index.mjs",
      "line": 117,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "readFileImpl(join(config.webRoot, 'texise-templates', 'institutions.json'), 'utf8'),"
    },
    {
      "path": "server/public-index.mjs",
      "line": 118,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "readFileImpl(join(config.webRoot, 'texise-templates', 'templates.json'), 'utf8'),"
    },
    {
      "path": "server/public-index.mjs",
      "line": 176,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "return `User-agent: *\\nAllow: /\\nDisallow: /api\\nDisallow: /join\\nDisallow: /ws\\nDisallow: /__texise\\nSitemap: ${publicUrl(config, '/sitemap.xml')}\\n`;"
    },
    {
      "path": "server/public-index.node.test.mjs",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(robots, /Disallow: \\/__texise/u);"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 133,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return `<main data-texise-prerender=\"compare-hub\"><header><p>Compare LaTeX editors</p><h1>Compare LaTeX editors</h1><p>Compare project control, compilation, PDF, AI, collaboration, Git and research tools.</p></header><section><h2>Direct comparisons</h2><ul>${competitors}</ul></section><section><h2>Decision guides</h2><ul>${guides}</ul></section><section><h2>Your local first workspace for research</h2><p>Learnitive keeps ordinary LaTeX files, local compilation, PDF, AI, Paper Memory, Git, "
    },
    {
      "path": "server/public-seo.mjs",
      "line": 142,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return `<main data-texise-prerender=\"compare-detail\"><header><p>${escapeHtml(item.eyebrow)}</p><h1>Learnitive vs ${escapeHtml(item.name)}</h1><p>${escapeHtml(item.summary)}</p></header><section><h2>Why Learnitive differs</h2>${compareList((item.strengths ?? []).map((entry) => `${entry.title}: ${entry.copy}`))}</section><section><h2>Capability comparison</h2><table><thead><tr><th>Capability</th><th>Learnitive</th><th>${escapeHtml(item.name)}</th></tr></thead><tbody>${rows}</t"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 149,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return `<main data-texise-prerender=\"compare-guide\"><header><p>${escapeHtml(guide.eyebrow)}</p><h1>${escapeHtml(guide.title)}</h1><p>${escapeHtml(guide.summary)}</p></header><section><h2>Best fit by workflow</h2><p>${escapeHtml(guide.methodology)}</p>${verdicts}</section><section><h2>Editors in this guide</h2><ul>${details}</ul></section>${compareFaq(guide.faq)}</main>`;"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 195,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const raw = await readFileImpl(join(config.webRoot, 'texise-templates', 'templates.json'), 'utf8');"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 206,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const raw = await readFileImpl(join(config.webRoot, 'texise-templates', 'redirects.json'), 'utf8');"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 216,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "readFileImpl(join(config.webRoot, 'texise-templates', 'categories.json'), 'utf8'),"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 217,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "readFileImpl(join(config.webRoot, 'texise-templates', 'templates.json'), 'utf8'),"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 232,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const raw = await readFileImpl(join(config.webRoot, 'texise-templates', 'institutions.json'), 'utf8');"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 241,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const raw = await readFileImpl(join(config.webRoot, 'texise-templates', 'templates.json'), 'utf8');"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 277,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return String(value || '').replaceAll('{{TEXISE_FREE_PLAN_LIMIT}}', String(config?.freePlanProjectLimit || 5));"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 300,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return `<article class=\"texise-change-log-event\"><div class=\"texise-change-log-date\"><time datetime=\"${escapeHtml(date)}\">${escapeHtml(date)}</time></div><div class=\"texise-change-log-card\"><h2>${escapeHtml(item.title)}</h2>${content ? `<div class=\"texise-prose\">${content}</div>` : ''}</div></article>`;"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 302,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return `<section class=\"texise-page-container texise-change-log-page\" data-texise-prerender=\"change-log\"><header class=\"texise-change-log-heading\"><span class=\"texise-eyebrow\">Product updates</span><h1 class=\"texise-display\">${escapeHtml(title)}</h1><div class=\"texise-prose\">${intro}</div></header>${events ? `<div class=\"texise-change-log-timeline\" aria-label=\"Recent Learnitive changes\">${events}</div>` : '<div class=\"texise-empty-state\"><p>No published changes yet.</p></div>'}</section>`"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 600,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const marker = /<!-- (?:LEARNITIVE|TEXISE)_SEO_START -->[\\s\\S]*?<!-- (?:LEARNITIVE|TEXISE)_SEO_END -->/u;"
    },
    {
      "path": "server/public-seo.mjs",
      "line": 614,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const guardedPrerender = `<div data-texise-prerender-shell hidden aria-hidden=\"true\">${prerender}</div>`;"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 6,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const shell = '<!doctype html><html><head><!-- TEXISE_SEO_START --><title>old</title><!-- TEXISE_SEO_END --></head><body><div id=\"root\"></div></body></html>';"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 241,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(detail.html, /data-texise-prerender=\"compare-detail\"/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 247,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(detail.html, /data-texise-prerender-shell hidden aria-hidden=\"true\"/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 253,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(guide.html, /data-texise-prerender=\"compare-guide\"/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 273,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (sql.includes('cms_change_log_settings')) return [{ title: 'What changed in Learnitive', intro_markdown: 'Recent **product updates** for up to {{TEXISE_FREE_PLAN_LIMIT}} Free projects.', updated_at: '2026-08-29T01:00:00Z' }];"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 274,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (sql.includes('cms_change_events')) return [{ id: 1, title: 'Instant preview', content_markdown: 'Live PDF got faster for all {{TEXISE_FREE_PLAN_LIMIT}} Free project slots.', change_date: '2026-08-29', updated_at: '2026-08-29T02:00:00Z' }];"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 282,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(result.html, /data-texise-prerender=\"change-log\"/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 283,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(result.html, /data-texise-prerender-shell/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 284,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(result.html, /data-texise-prerender-shell hidden aria-hidden=\"true\"/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 285,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.doesNotMatch(result.html, /texise-prerender-visibility/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 286,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(result.html, /class=\"texise-page-container texise-change-log-page\"/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 287,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(result.html, /class=\"texise-change-log-timeline\"/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 288,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(result.html, /class=\"texise-change-log-card\"/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 289,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(result.html, /class=\"texise-prose\"/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 292,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(result.html, /TEXISE_FREE_PLAN_LIMIT/u);"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 298,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "test('legacy TeXise SEO markers remain replaceable during migration', async () => {"
    },
    {
      "path": "server/public-seo.node.test.mjs",
      "line": 299,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const legacyShell = '<!doctype html><html><head><!-- TEXISE_SEO_START --><title>old</title><!-- TEXISE_SEO_END --></head><body><div id=\"root\"></div></body></html>';"
    },
    {
      "path": "server/saas-auth-flow.node.test.mjs",
      "line": 8,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "publicUrl: 'https://www.texise.com',"
    },
    {
      "path": "server/saas-auth-flow.node.test.mjs",
      "line": 15,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "redirectUri: 'https://www.texise.com/api/auth/google/callback',"
    },
    {
      "path": "server/saas-auth-flow.node.test.mjs",
      "line": 34,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const returnCookie = result.cookies.find((cookie) => cookie.startsWith('texise_oauth_return='));"
    },
    {
      "path": "server/saas-auth-flow.node.test.mjs",
      "line": 35,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(returnCookie, /texise_oauth_return=%2Fprojects/u);"
    },
    {
      "path": "server/saas-auth-flow.node.test.mjs",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const request = { headers: { cookie: 'texise_oauth_state=expected; texise_oauth_verifier=verifier' } };"
    },
    {
      "path": "server/saas-auth-flow.node.test.mjs",
      "line": 42,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "finishGoogleOAuth({}, config(), request, new URL('https://www.texise.com/api/auth/google/callback?state=wrong&code=abc'), {"
    },
    {
      "path": "server/saas-auth-flow.node.test.mjs",
      "line": 52,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(cookie, /^texise_session=opaque-token-value;/u);"
    },
    {
      "path": "server/saas-auth-flow.node.test.mjs",
      "line": 67,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const session = await readSession(db, { headers: { cookie: 'texise_session=expired-token' } });"
    },
    {
      "path": "server/saas-auth-flow.node.test.mjs",
      "line": 83,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const session = await readSession(db, { headers: { cookie: 'texise_session=active-looking-token' } });"
    },
    {
      "path": "server/saas-auth-flow.node.test.mjs",
      "line": 101,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const session = await readSession(db, { headers: { cookie: 'texise_session=provider-token' } });"
    },
    {
      "path": "server/saas-auth.mjs",
      "line": 16,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const OAUTH_STATE_COOKIE = 'texise_oauth_state';"
    },
    {
      "path": "server/saas-auth.mjs",
      "line": 17,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const OAUTH_VERIFIER_COOKIE = 'texise_oauth_verifier';"
    },
    {
      "path": "server/saas-auth.mjs",
      "line": 18,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const OAUTH_RETURN_COOKIE = 'texise_oauth_return';"
    },
    {
      "path": "server/saas-auth.mjs",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "const LEGACY_ADMIN_EMAIL = 'admin@texise.com';"
    },
    {
      "path": "server/saas-auth.mjs",
      "line": 236,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "const email = 'admin@texise.com';"
    },
    {
      "path": "server/saas-auth.node.test.mjs",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "email: 'admin@texise.com',"
    },
    {
      "path": "server/saas-auth.node.test.mjs",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "return [{ id: 1, email: 'admin@texise.com', role: 'admin', status: 'active', google_sub: null }];"
    },
    {
      "path": "server/saas-contact.node.test.mjs",
      "line": 10,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "? { enabled: true, host: 'smtp.example.test', port: 465, secure: true, user: 'mailer', password: 'secret', from: 'support@texise.test' }"
    },
    {
      "path": "server/saas-contact.node.test.mjs",
      "line": 63,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const result = await handleContact(db, config(), request({ subject: 'Account support', message: 'This is a sufficiently long support message.' }, { cookie: 'texise_session=abc' }), {}, () => true);"
    },
    {
      "path": "server/saas-contact.node.test.mjs",
      "line": 142,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.equal(sent.to, 'support@texise.test');"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SAAS_ENABLED: '1',"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 12,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "MYSQL_DATABASE: 'texisecom_db',"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 13,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "MYSQL_USER: 'texise',"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_SAAS_ENABLED: '0',"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 24,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "MYSQL_DATABASE: 'texisecom_db',"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_MYSQL_CREATE_DATABASE: '0',"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 34,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "loadTexiseConfig(baseEnv({ TEXISE_MYSQL_CREATE_DATABASE: '1' })).saas.mysql.createDatabase,"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 38,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "() => loadTexiseConfig(baseEnv({ TEXISE_MYSQL_CREATE_DATABASE: 'sometimes' })),"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 66,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const config = loadTexiseConfig(baseEnv({ TEXISE_MYSQL_CREATE_DATABASE: '1' }));"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 71,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(calls[1][1], /^CREATE DATABASE IF NOT EXISTS `texisecom_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci$/);"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 74,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.equal(calls[3][1].database, 'texisecom_db');"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 82,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "createPool(options) { assert.equal(options.database, 'texisecom_db'); return pool; },"
    },
    {
      "path": "server/saas-db.node.test.mjs",
      "line": 91,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.equal(quoteMysqlIdentifier('texise-db'), '`texise-db`');"
    },
    {
      "path": "server/saas-entitlement.node.test.mjs",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "test('admin@texise.com admin-role account receives effective Pro3 sandbox entitlement without a license lookup', async () => {"
    },
    {
      "path": "server/saas-entitlement.node.test.mjs",
      "line": 10,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "const entitlement = await accountEntitlement(db, { id: 1, email: 'admin@texise.com', role: 'admin' });"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 14,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AUTOMATIC_AI_DOC_V11 = \"Automatic AI suggestions watch for safe writing opportunities after you pause. They are designed to stay out of the active typing path.\\n\\n## Enable or disable\\n\\nOpen **AI Settings** and choose one of:\\n\\n- **Off** \\u2014 no automatic suggestions\\n- **Local AI only** \\u2014 automatic model work uses the selected local model\\n- **Current AI provider** \\u2014 automatic model work uses the currently configured BYOK provider\\n\\nYou can also **Pause 10 min**, **Pause se"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 15,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "const AUTOMATIC_AI_DOC_V12 = \"Automatic AI suggestions review the scholarly prose you just changed after you pause. They are designed to stay out of the active typing path and never silently rewrite the manuscript.\\n\\n## Enable or disable\\n\\nOpen **AI Settings** and choose one of:\\n\\n- **Off** \\u2014 no automatic suggestions\\n- **Local AI only** \\u2014 automatic model work uses the selected downloaded local model\\n- **Current AI provider** \\u2014 automatic model work uses the currently configure"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 17,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AUTOMATIC_AI_DOC_V13 = \"Automatic AI suggestions review the scholarly prose you just changed after you pause. They stay outside the active typing path and never silently rewrite the manuscript.\\n\\n## Enable or disable\\n\\nOpen **AI Settings** and choose **Off**, **Local AI only** or **Current AI provider**. Local mode uses the selected downloaded model; provider mode uses the current browser-memory BYOK configuration. You can also **Pause 10 min**, **Pause session** or **Resume**.\\n\\n## Whe"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const CITATIONS_DOC_V11 = \"TeXise keeps citations tied to canonical LaTeX bibliography commands and project bibliography files.\\n\\n## Bibliography files\\n\\nUse normal .bib files and the bibliography package required by your document. Project-aware Source assistance can discover known citation keys.\\n\\n## Search and import\\n\\nWhen scholarly metadata is retrieved, inspect the source and bibliographic fields before adding it to the project. Verified citation insertion creates ordinary LaTeX/BibTeX-"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AUTOMATIC_AI_DOC_V14 = \"Automatic AI suggestions review the scholarly prose you just changed after you pause. They stay outside the active typing path and never silently rewrite the manuscript.\\n\\n> **Quick trigger — `..?`**\\n> With Automatic AI enabled, type `..?` immediately after the prose you want TeXise to review. TeXise treats those three characters as a command cue, removes the cue from the manuscript, and starts a review of the preceding prose immediately. The cue only fires in a s"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 21,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "const CITATIONS_DOC_V13 = \"TeXise keeps citations grounded in real scholarly records, canonical LaTeX citation commands and ordinary project bibliography files.\\n\\n## Suggest citation from selected prose\\n\\nSelect the manuscript claim and choose **AI Suggest → Suggest citation**. This action does not ask a language model to invent a citation key. It opens the grounded Research Assistance citation picker, pre-fills the selected claim and runs the scholarly search. Choose a real result, inspect it"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AUTOMATIC_AI_DOC_V15 = \"Automatic AI suggestions can still watch normal prose after a writing pause, but the `..?` command is a separate direct Local-AI action. TeXise never silently rewrites the manuscript.\\n\\n> **Quick trigger — `..?` reviews the previous line**\\n> Type `..?` on the line after the source line you want reviewed. TeXise removes the three-character cue, reads exactly the complete source line immediately above the cue line, and sends that exact line to Local AI for a grammar"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AI_OVERVIEW_DOC_V14 = \"TeXise supports Local AI and browser-held BYOK cloud AI. The provider is configured once in AI Settings and reused by AI Suggest and AI Review.\\n\\n## Local AI\\n\\nLocal AI uses a compatible model downloaded to the browser environment. Manuscript reasoning stays local to that model runtime. Model quality and context limits depend on the selected model.\\n\\n## BYOK cloud AI\\n\\nBYOK means Bring Your Own Key. TeXise supports configured cloud providers using a credential he"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AUTOMATIC_AI_DOC_V16 = \"Automatic AI suggestions can still watch normal prose after a writing pause, but the `..?` command is a separate direct Local-AI force action. TeXise never silently rewrites the manuscript.\\n\\n> **Quick trigger — `..?` forces Local AI**\\n> Type `..?` whenever you want an immediate Local AI suggestion. If you type the cue after text on the same line, TeXise removes the cue and reviews that line up to the cue. If `..?` is on its own line, TeXise removes it and reviews"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AUTOMATIC_AI_DOC_V17 = \"Automatic AI suggestions review the manuscript line you just changed after a short writing pause. The `..?` command is a separate direct Local-AI force action. TeXise never silently rewrites the manuscript.\\n\\n> **Quick trigger — `..?` forces Local AI**\\n> Append `..?` to a line to review that line immediately, or type `..?` on its own line to review the complete non-empty source line immediately above it. TeXise removes the cue before generating. The command bypass"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AUTOMATIC_AI_DOC_V18 = \"Automatic AI suggestions now use one simple On/Off switch and always follow the provider selected in **AI Setup**. AI Setup defaults to Local AI, and you can switch it to a browser-stored BYOK cloud provider. TeXise never silently rewrites the manuscript.\\n\\n> **Force trigger — `..?`**\\n> Type `..?` whenever you want an immediate AI suggestion, even when Automatic AI Suggestions are **Off**. Append the cue to a line to review the text on that line before the cue, or"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AI_OVERVIEW_DOC_V15 = \"TeXise supports Local AI and browser-local BYOK cloud AI. The provider is configured once in AI Settings and reused by AI Suggest and AI Review.\\n\\n## Local AI\\n\\nLocal AI uses a compatible model downloaded to the browser environment. Manuscript reasoning stays local to that model runtime. Model quality and context limits depend on the selected model.\\n\\n## BYOK cloud AI\\n\\nBYOK means Bring Your Own Key. TeXise stores configured cloud-provider credentials only in thi"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 30,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AI_OVERVIEW_DOC_V20 = \"TeXise gives you three ways to run writing and research AI from the same project: browser Local AI, Ollama on your computer, or BYOK AI with your own cloud provider key. The selected AI mode is configured once in AI Settings and reused by AI Suggest, Automatic AI Suggestions and AI Review.\\n\\n## Local AI\\n\\nLocal AI uses a compatible Gemma model downloaded into the browser runtime. Prompts, manuscript context and responses remain in this browser. Model quality and co"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const OLLAMA_DOC_V20 = \"Ollama lets TeXise use models served locally on your computer while keeping the same AI Suggest, Automatic AI, AI Review and research workflow used by other TeXise AI modes.\\n\\n## Ollama vs TeXise Local AI\\n\\n**TeXise Local AI** runs a downloaded Gemma model directly inside the browser. **Ollama** runs as a separate local service on your computer and can expose a wider range of models. Neither mode needs an API key. BYOK AI is different: it sends the requested context dir"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 40,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "const PAPER_MEMORY_DOC_V20 = \"Paper Memory lets TeXise answer and review with evidence from papers you explicitly add to the project research workflow.\\n\\n## Index papers\\n\\nImported papers are parsed and indexed for retrieval. The local Paper Memory pipeline stores project-scoped representations used for search and grounded AI context, including provenance that can be tied back to source/page evidence.\\n\\n## Ask questions\\n\\nWhen Paper Memory is enabled for an AI workflow, TeXise retrieves rele"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 43,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const PLANS_AND_FEATURES_DOC_V18 = \"TeXise keeps the core scientific-writing workflow available on every plan. Pro is intentionally focused on collaboration hosting, clean PDF export and priority support rather than locking basic writing tools behind a paywall.\\n\\n## Free\\n\\nFree includes:\\n\\n- Unlimited projects\\n- Unlimited local and cloud compiles\\n- Unlimited Local AI\\n- BYOK cloud AI integration\\n- AI Review\\n- AI Paper Memory\\n- TexLab after sign-in\\n- Templates\\n- Version control\\n- Joini"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 44,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const PLANS_AND_FEATURES_DOC_V19 = \"TeXise keeps the core scientific-writing workflow available on every plan. Pro is focused on unlimited projects, collaboration hosting, clean PDF export and Priority support rather than locking basic writing tools behind a paywall.\\n\\n## Free\\n\\nFree includes:\\n\\n- Up to {{TEXISE_FREE_PLAN_LIMIT}} owned projects\\n- Unlimited local and cloud compiles\\n- Unlimited Local AI\\n- BYOK cloud AI integration\\n- AI Review\\n- AI Paper Memory\\n- TexLab after sign-in\\n- Te"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 47,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Ollama is a local-service option. TeXise connects from the browser to an Ollama service running on this computer, discovers installed models and uses Ollama's OpenAI-compatible chat API. Ollama does not require an API key. TeXise never silently falls back from Ollama to a cloud provider if the local service is unavailable.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 48,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Ollama is a local-service option. TeXise connects from the browser to an Ollama service running on this computer, discovers installed models, inspects the selected model and uses Ollama's OpenAI-compatible chat API. Ollama itself can expose remote/cloud-backed models through localhost, so TeXise blocks those models in local-service mode and permits manuscript context only after verifying that the selected model is installed locally. Ollama does not require an API key. TeXise never silently fall"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 52,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Privacy Mode blocks manuscript/project context from BYOK cloud providers. It does not block browser Local AI. Ollama is permitted only after TeXise verifies the selected model as locally installed and not remote/cloud-backed; localhost connectivity by itself is not treated as proof of local inference.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 57,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Click **Test connection**. TeXise checks Ollama's version endpoint and reads installed models from `/api/tags`. Choose an installed model and save AI Setup.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 58,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Click **Test connection**. TeXise checks Ollama's version endpoint and reads models from `/api/tags`. Remote/cloud-backed models are shown as unavailable in local-service mode. When you select a model, TeXise also inspects `/api/show` and requires a locally installed completion-capable model before manuscript context is sent. Choose a valid local model and save AI Setup.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 61,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Ollama prompts are sent from this browser to the loopback service on this computer. TeXise does not require or store an Ollama API key. If Ollama stops or the browser blocks the connection, TeXise reports the local failure; it does **not** silently send the manuscript to BYOK AI. Privacy Mode can remain enabled with Ollama.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 62,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Ollama prompts are sent from this browser to the loopback service on this computer only after TeXise verifies the selected model as locally installed. Ollama can expose cloud-backed models through localhost; TeXise blocks those models in local-service mode instead of treating localhost as proof of local inference. TeXise does not require or store an Ollama API key. If Ollama stops, the model becomes remote, or the browser blocks the connection, TeXise reports the failure; it does **not** silent"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 68,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Paper Memory can be used with browser Local AI, with an Ollama model that TeXise has verified as installed locally and not remote/cloud-backed, or with the BYOK AI provider you explicitly selected.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 72,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Ollama receives retrieved context only after TeXise verifies the selected model as a local model; remote/cloud-backed Ollama models are blocked from the local-service path.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 76,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const OLLAMA_DOC_V22 = \"Ollama lets TeXise run AI models on your own computer for free. The workflow follows the familiar local-Ollama pattern: install Ollama, run a model, open the TeXise AI Assistant, choose **Use Local Ollama**, select a discovered model and start chatting. While Local Ollama is active, inference uses the model running on your computer rather than a TeXise server.\\n\\n## System requirements\\n\\nFor smaller 7B–13B models, plan for at least **8 GB RAM** (16 GB recommended), aroun"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 80,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Ollama does not require an API key. TeXise never silently falls back from Ollama to a cloud provider if the local service is unavailable.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 81,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Ollama does not require an API key. TeXise automatically detects the standard localhost Ollama service when the AI Assistant opens. If Ollama later becomes unreachable, TeXise can automatically fall back to the last configured BYOK AI provider; Privacy Mode disables that cloud fallback.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 88,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const PAPER_MEMORY_DOC_V22 = PAPER_MEMORY_DOC_V21 + \"\\n\\n## Ollama availability\\n\\nWhen Local Ollama is selected, TeXise uses the verified local model while the Ollama service is running. If Ollama becomes unavailable and Privacy Mode is off, TeXise can use the last configured BYOK AI provider as the automatic cloud fallback. Privacy Mode keeps this fail-closed.\";"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 92,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Ollama is a local-service option. TeXise connects from the browser to an Ollama service running on this computer, discovers installed models, inspects the selected model and uses Ollama's OpenAI-compatible chat API. Ollama itself can expose remote/cloud-backed models through localhost, so TeXise blocks those models in local-service mode and permits manuscript context only after verifying that the selected model is installed locally. Ollama does not require an API key. TeXise automatically detec"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 93,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Ollama is reached through the Ollama service running on your computer. TeXise automatically detects that localhost service, discovers both locally installed and Ollama Cloud-backed models, inspects the selected model and uses Ollama's OpenAI-compatible chat API. Local models keep inference on your computer. Ollama Cloud-backed models are available when Privacy Mode is off and may send manuscript context to Ollama Cloud. Ollama does not require a TeXise API key. If Ollama later becomes unreachab"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 96,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Privacy Mode blocks manuscript/project context from BYOK cloud providers. It does not block browser Local AI. Ollama is permitted only after TeXise verifies the selected model as locally installed and not remote/cloud-backed; localhost connectivity by itself is not treated as proof of local inference.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 97,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Privacy Mode blocks manuscript/project context from BYOK AI cloud providers and Ollama Cloud-backed models. It does not block browser Local AI or a verified locally installed Ollama model. TeXise checks the selected Ollama model before sending manuscript context so localhost connectivity is never confused with local inference.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 102,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Ollama lets TeXise run AI models on your own computer for free. The workflow follows the familiar local-Ollama pattern: install Ollama, run a model, open the TeXise AI Assistant, choose **Use Local Ollama**, select a discovered model and start chatting. While Local Ollama is active, inference uses the model running on your computer rather than a TeXise server.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 103,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Ollama lets TeXise use models through the Ollama service running on your computer. TeXise supports both locally installed Ollama models and Ollama Cloud-backed models discovered through that local service. Local models keep inference on your computer; Ollama Cloud models may send manuscript context to Ollama Cloud and therefore require Privacy Mode to be off. The TeXise server never runs or proxies Ollama.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 106,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"1. Click **Use Local Ollama** when TeXise detects the local service.\\n2. Choose the model you want from the model dropdown.\\n3. Start chatting or use the same provider through AI Suggest, AI Review and supported Paper Memory flows.\\n\\nYou can also open **AI Settings → Use Local Ollama**. The settings dialog performs the same automatic detection and has a **Refresh Ollama** action when you add or remove models.\\n\\nTeXise verifies that a selected Ollama model is actually installed locally before "
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 107,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"1. Click **Use Local Ollama** for a discovered local model, or choose **Use Ollama Cloud** when a cloud-backed Ollama model is available and Privacy Mode is off.\\n2. Choose the model you want from the Ollama model dropdown. Local and Cloud models are labelled explicitly.\\n3. Start chatting or use the same provider through AI Suggest, AI Review and supported Paper Memory flows.\\n\\nYou can also open **AI Settings → Ollama · Local + Cloud**. The settings dialog performs the same automatic detectio"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 111,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"**Privacy Mode disables Ollama Cloud and automatic cloud fallback.** With Privacy Mode enabled, TeXise permits only browser Local AI or a verified locally installed Ollama model; an unavailable Ollama service fails closed instead of sending manuscript context to any cloud provider.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 114,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const PAPER_MEMORY_DOC_V23 = PAPER_MEMORY_DOC_V22 + \"\\n\\n## Ollama Cloud\\n\\nPaper Memory can also use an Ollama Cloud-backed model when Privacy Mode is off. TeXise labels that execution as **Ollama Cloud** and sends only the retrieved manuscript/research context needed for the request through the user's local Ollama service to the cloud-backed model. Privacy Mode blocks Ollama Cloud and keeps Paper Memory on browser Local AI or a verified local Ollama model.\";"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 118,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"TeXise automatically detects that localhost service, discovers both locally installed and Ollama Cloud-backed models, inspects the selected model and uses Ollama's OpenAI-compatible chat API.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 119,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"TeXise does not probe localhost during passive app startup or while another AI provider is selected. When you explicitly select Ollama, refresh Ollama, or initiate an AI request while Ollama is already the selected provider, TeXise checks the standard localhost service, discovers both locally installed and Ollama Cloud-backed models, inspects the selected model and uses Ollama's OpenAI-compatible chat API. Your browser may ask for Local Network Access at that point.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 124,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Keep Ollama running. Open the TeXise **AI Assistant**. TeXise automatically checks `localhost:11434` and discovers your installed models.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 125,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"Keep Ollama running. TeXise does **not** access `localhost:11434` during passive app startup, normal browsing, or while another AI provider is selected. Choose **Use Ollama** in the AI Assistant, select **Ollama · Local + Cloud** in AI Settings, press **Refresh Ollama**, or start an AI request while Ollama is already your selected provider. Only then does TeXise contact `localhost:11434`. Your browser may show a Local Network Access permission prompt at that point; allow it if you want TeXise t"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 133,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"## Step 1 — Install Ollama\\n\\nDownload and install Ollama for your operating system from the official Ollama website. Ollama runs on **your computer**; nothing needs to be installed on the TeXise server.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 134,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"## Step 1: Install Ollama\\n\\nDownload and install Ollama for your operating system:\\n\\n[Download Ollama](https://ollama.com/download)\\n\\nFollow the installation instructions for your OS. Once installed, you can run Ollama from your terminal. Ollama runs on **your computer**; nothing needs to be installed on the TeXise server.\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 142,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TEMPLATES_GUIDE_DOC_V18 = \"Templates provide complete LaTeX starting projects while keeping the resulting files under your control.\\n\\n## Open Templates\\n\\nIn the editor sidebar, select **Templates** immediately above the **Opened** section. You can also browse the full public template library from the Templates page.\\n\\n## Browse and preview\\n\\nTemplates can be grouped by document category and academic institution. Quick Preview lets you inspect the template before creating a project. Pub"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 143,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TEMPLATES_GUIDE_DOC_V19 = \"Templates provide complete LaTeX starting projects while keeping the resulting files under your control.\\n\\n## Open Templates\\n\\nUse the **Templates** shortcut in the editor sidebar or browse the full public template library from the Templates page.\\n\\n## Browse and preview\\n\\nTemplates can be grouped by document category and academic institution. Quick Preview lets you inspect the template before creating a project. Published categories and institutions are show"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 144,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const GETTING_STARTED_DOC_V18 = \"TeXise is a local-first LaTeX research workspace built around ordinary project files. You can begin with a blank project, import an existing LaTeX ZIP, or start from a template.\\n\\n## Create or import a project\\n\\nOpen **Projects** and choose a new project, import a ZIP, or browse Templates. Project creation is unlimited on Free and Pro.\\n\\n## Choose an editing surface\\n\\nUse **Source** when you want exact LaTeX control. Use **Visual** for supported manuscript-st"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 145,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const GETTING_STARTED_DOC_V19 = \"TeXise is a local-first LaTeX research workspace built around ordinary project files. You can begin with a blank project, import an existing LaTeX ZIP, or start from a template.\\n\\n## Create or import a project\\n\\nOpen **Projects** and choose a new project, import a ZIP, or browse Templates. Free supports up to {{TEXISE_FREE_PLAN_LIMIT}} owned projects whether or not you are signed in. Blank projects, ZIP imports, linked folders, Git imports, duplicates and templ"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 146,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AUTHENTICATION_AND_ACCOUNT_DOC_V18 = \"Most local-first writing features do not depend on a paid account, but server-owned sessions need an authenticated identity.\\n\\n## Projects\\n\\nProject creation is unlimited on every plan. Browser-local projects remain available without turning a Pro expiry into a project lock.\\n\\n## TexLab\\n\\nStarting TexLab requires sign-in because TeXise creates a server-side terminal session and short-lived websocket credential. TexLab itself is available on Free an"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 147,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const AUTHENTICATION_AND_ACCOUNT_DOC_V19 = \"Most local-first writing features do not depend on a paid account, but server-owned sessions need an authenticated identity.\\n\\n## Projects\\n\\nFree supports up to {{TEXISE_FREE_PLAN_LIMIT}} owned projects whether you are anonymous or signed in. Signing in does not reset or multiply that allowance: TeXise counts local owned projects together with account project records that are not already represented locally. Joined collaboration workspaces are not tr"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 162,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"The TeXise editor keeps Source, Visual editing, PDF preview and research tools around the same LaTeX project files.\\n\\n## Source and Visual\\n\\n**Source** is the canonical LaTeX editor. It is the best mode for exact command-level work, custom macros and complex package-specific syntax.\\n\\n**Visual** projects supported LaTeX into an editable manuscript view. Unsupported or structurally sensitive LaTeX is preserved in protected components rather than discarded. You can jump from a prote"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 169,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"Source mode is the canonical LaTeX editing surface in TeXise.\\n\\n## Exact LaTeX editing\\n\\nSource preserves your commands, comments, environments, bibliography calls and project-specific formatting exactly. CodeMirror provides syntax-aware editing, project-aware navigation, search and LaTeX assistance without converting the file into a proprietary document model.\\n\\n## Line endings\\n\\nTeXise preserves LF and CRLF projects. Cursor and selection offsets are mapped safely for non-collab"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 176,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"Visual mode provides manuscript-style editing while preserving canonical LaTeX source.\\n\\n## Editable content\\n\\nSupported paragraphs, headings, lists, common formatting, equations, tables and other known structures are projected into editable Visual nodes.\\n\\n## Protected LaTeX\\n\\nUnsupported or structurally sensitive commands are shown as protected components. A protected component must preserve its source, identify what it represents and provide a route back to the exact Source ra"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 190,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"TeXise supports local browser compilation and private Cloud Compile. Both are available on Free and Pro.\\n\\n## Local Compile\\n\\nLocal Compile is browser-first. Project source and assets stay in the browser project or linked folder while the WebAssembly compiler runs. The installed compiler profile can provide pdfLaTeX, XeLaTeX and LuaLaTeX according to release certification.\\n\\n## Cloud Compile\\n\\nCloud Compile temporarily sends the files needed for a compile job to the isolated serv"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 197,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"Live PDF keeps the preview close to the current manuscript without putting compilation in the keystroke path.\\n\\n## Quiet period after typing\\n\\nWhen source changes, TeXise waits for a short quiet period before starting a new Live PDF compile. If you resume typing while an obsolete compile is running, TeXise cancels or supersedes that work where supported.\\n\\n## Local and cloud routing\\n\\nLive PDF follows the project compile preference. A project can use Local Compile or Cloud Compil"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 204,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"TeXise separates PDF compilation from PDF export entitlement.\\n\\n## Preview\\n\\nFree and Pro users can compile and preview PDFs. Live PDF, PDF.js viewing, search and SyncTeX operate on the canonical compile result.\\n\\n## Free export\\n\\nFree PDF export adds a TeXise watermark to the exported copy. The canonical Live PDF used inside the workspace is not modified by that export-only watermark step.\\n\\n## Pro export\\n\\nPro Lifetime and active Pro Monthly export the clean compiled PDF with"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 215,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"title\": \"Using Ollama with TeXise\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 246,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"TeXise live collaboration synchronizes canonical Source editing with Yjs while keeping comments and Track Changes in the shared review workflow.\\n\\n## Join a collaboration\\n\\nOpen the Project invitation link supplied by the host. Joining an invited collaboration does not require a TeXise login. Anonymous participants can provide the lightweight display identity requested by the collaboration flow.\\n\\n## Start a collaboration\\n\\nStarting or hosting a new collaboration requires:\\n\\n1. "
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 253,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"TexLab provides an isolated Linux coding environment from the TeXise editor.\\n\\n## Sign-in requirement\\n\\nTexLab is available to Free and Pro, but starting a server terminal session requires sign-in. Authentication is required because TeXise creates an isolated server-side session and short-lived websocket credential.\\n\\n## Send project explicitly\\n\\nA new TexLab workspace starts separate from your browser or linked-folder project. Use **Send project** when you intentionally want to "
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 257,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"title\": \"TeXise CLI workflow\","
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 260,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"TeXise is designed to work with normal LaTeX files, so local command-line workflows can coexist with the browser editor.\\n\\n## Local project ownership\\n\\nKeep .tex, .bib, figures and supporting files in your own folders and version-control repositories. TeXise does not require a proprietary document format.\\n\\n## Git\\n\\nUse Git locally or from TexLab to commit, branch and review changes. Keep provider credentials user-scoped and revocable.\\n\\n## Compile locally\\n\\nA locally installed"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 267,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "\"content\": \"TeXise keeps versioning around ordinary project files rather than replacing them with a proprietary document format.\\n\\n## Project snapshots\\n\\nTeXise history and recovery checkpoints help restore earlier canonical project state. Review changes and AI provenance remain separate from manuscript source until accepted where required.\\n\\n## Git\\n\\nGit is the durable developer-oriented history layer. Repositories can be managed in your local environment or in TexLab. Commit generated arti"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 281,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"TeXise preserves LaTeX math as canonical source while providing equation-aware editing and previews.\\n\\n## Source math\\n\\nInline math, display math and supported equation environments remain ordinary LaTeX. Source mode is the authority for custom macros and package-specific constructs.\\n\\n## MathLive\\n\\nWhen the caret is in a supported math region, TeXise can open the MathLive equation experience for structured editing. The resulting edit is mapped back to the exact canonical source "
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 288,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"Figures and tables stay source-backed so Visual conveniences do not discard package-specific LaTeX.\\n\\n## Figures\\n\\nKeep image assets inside the project and reference them with normal LaTeX such as includegraphics. TeXise resolves common project-relative PNG, JPEG and PDF assets for previews where possible. Extensionless paths and graphicspath are handled by the project asset resolver where supported.\\n\\n## Complex figures\\n\\nNested minipages, custom figure environments or other str"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 295,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"TeXise follows familiar editor shortcuts where the browser and operating system allow them.\\n\\n## Editing\\n\\nUse your platform undo/redo, copy, paste, search and selection shortcuts in Source and supported Visual content. Source mode uses CodeMirror and keeps editor history per file.\\n\\n## Command surfaces\\n\\nThe editor command palette and contextual tools provide discoverable actions when a shortcut is not obvious. Visual slash actions offer manuscript-oriented insertion commands wi"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 302,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "\"content\": \"The integrated PDF workspace renders compile output with PDF.js and keeps navigation connected to the manuscript.\\n\\n## Continuous preview\\n\\nLive PDF updates after a short writing quiet period. Manual Compile is available when you want an immediate build.\\n\\n## Search and text\\n\\nPDF.js provides selectable text and document search where the generated PDF contains a usable text layer.\\n\\n## Source to PDF\\n\\nWhen the compile result contains SyncTeX data, Source-to-PDF navigation can r"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 309,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "\"content\": \"TeXise keeps literature work close to the manuscript without treating generated text as verified evidence.\\n\\n## Papers and Paper Memory\\n\\nAdd papers you want to search or reason over. Paper Memory indexes project-scoped evidence for grounded retrieval and can be used with Local AI or your selected BYOK provider.\\n\\n## Research search\\n\\nScholarly search uses real provider results when available. TeXise distinguishes retrieved sources from AI-generated prose and does not invent unav"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 323,
      "category": "legacy-identifier",
      "rationale": "internal identifier containing the legacy product token",
      "text": "\"content\": \"Deep Research is a staged research workflow for questions that need more than a single model response.\\n\\n## Staged execution\\n\\nTeXise can plan bounded research steps, collect available scholarly evidence, synthesize findings and run a separate verification pass. Work is cancellable so a long research operation does not own the editor indefinitely.\\n\\n## Evidence first\\n\\nRetrieved papers and metadata remain distinguishable from generated analysis. Unavailable evidence is reported a"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 330,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "\"content\": \"Comments and Track Changes provide a review layer around canonical LaTeX source. They can be used locally and are shared during supported collaboration sessions.\\n\\n## Track Changes\\n\\nTracked insertions and deletions are represented in Review metadata rather than embedded as hidden TeXise markers inside the manuscript. Accept or Reject applies a revision-checked canonical source edit.\\n\\n## Comments\\n\\nComments anchor to source positions and can carry replies and resolved state. Dur"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 656,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "SELECT id, 'Local Compile runs entirely in your browser and is the default TeXise compile path. It is available on Free and does not require an account."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 660,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Your project source, figures and bibliography remain in your browser project or linked folder. Local Compile does not upload manuscript files to TeXise."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 664,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TeXise uses its browser BusyTeX/WASM toolchain for the engines certified by the installed release. The compiler selector shows the engines available in the current build. Package availability comes from the bundled/remote TeX environment used by that browser compiler."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 672,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Successful builds feed TeXise PDF.js and SyncTeX integration. PDF follows editor is enabled by default; Editor follows PDF remains opt-in."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 676,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Open the compile log for the exact TeX error, verify the selected engine, and check that required packages/assets are available. Local Compile stays browser-first. When the browser fails specifically because of a TeX Live package, font, engine or runtime limitation, TeXise can switch the project to the isolated Docker TeX Live Full reliability fallback; the project remembers that fallback for subsequent Compile and Live PDF updates until compiler settings are changed. The compiler settings discl"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 681,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "SELECT id, 'Cloud Compile · Pro is the manually selectable private server compile target. It does not replace browser-first Local Compile. Separately, TeXise can automatically retry a Local Compile once in the same isolated Docker TeX Live Full environment when the browser fails specifically because of a package, font, engine or runtime limitation."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 689,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "When you explicitly choose Cloud Compile, TeXise temporarily sends the files required for that compile job to the private compile service. Manuscript source is not stored in MySQL, application analytics or Cloud Compile quota logs. Job source and generated artifacts live only in the isolated temporary workspace and are removed after success, failure or timeout; abandoned jobs also have a hard cleanup TTL."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 697,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Production jobs run in Docker with outbound networking disabled, a read-only container filesystem, a read-only project input mount, dropped Linux capabilities, no-new-privileges, an unprivileged container user, and CPU, memory and PID limits. Shell escape is disabled. The worker receives only the generated job workspace, not TeXise secrets."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 705,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Cloud package and BibTeX/Biber availability depends on the production compile image. TeXise returns the compile log so missing packages or bibliography tools remain diagnosable."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 713,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Use Local Compile as the browser-first default. If the browser hits a TeX Live environment limitation and Full fallback is enabled, TeXise may switch that project to Docker TeX Live Full, remember the fallback for later Compile and Live PDF updates, and temporarily upload the required project files as disclosed in compiler settings. Choose Cloud Compile · Pro when you intentionally want the private server compiler as the primary compile target.', NULL FROM cms_docs WHERE slug = 'cloud-compile'"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 722,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "VALUES ('linux-terminal-pro', 'TeXise Terminal · Pro', 'Terminal', 10, 'published', CURRENT_TIMESTAMP(3))`,"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 724,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "SELECT id, 'TeXise Terminal · Pro gives logged-in Pro users an isolated Linux shell directly from the editor top bar. It uses the dedicated texlive/texlive-console:pro image, independent from the Cloud Compile image, with an interactive policy designed for scientific coding."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 728,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Select **TeXise Terminal · Pro** in the editor toolbar. TeXise verifies the account session and Pro entitlement on the trusted API before creating a terminal workspace. The browser receives only a short-lived websocket token; the private Console Gateway secret is never sent to the browser."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 732,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "A new TeXise Terminal workspace starts empty. Select **Send project** to explicitly copy the current project files into /workspace. Opening the terminal never silently uploads a linked folder or browser project."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 736,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "The production TeXise Terminal image is texlive/texlive-console:pro. Release certification requires bash, Git/GitHub CLI, Python 3 with pip and venv, NumPy, SciPy, pandas, Matplotlib, SymPy, GCC/G++, make, cmake, zip/unzip/tar, curl/wget/jq, plus TeX Live engines, Biber and latexmk. Missing advertised tools fail TeXise Terminal production certification."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 740,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "Each session gets a random workspace and container name, a non-root container identity, dropped Linux capabilities, no-new-privileges, CPU/memory/PID limits and temporary home/tmp filesystems. The container uses controlled Docker bridge networking for GitHub and package workflows; it never receives /etc/texise, database credentials, Cloud Compile secrets or the Docker socket."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 749,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "SELECT id, 'TeXise Terminal · Pro includes a certified scientific Python environment directly in the dedicated texlive/texlive-console:pro image."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 761,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Write results, datasets, figures or compiled artifacts inside /workspace. Open the terminal **Files** browser to download generated files through the authenticated TeXise API.', NULL FROM cms_docs WHERE slug = 'terminal-python-scientific'"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 766,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "SELECT id, 'TeXise Terminal · Pro includes Git and the GitHub CLI in the dedicated texlive/texlive-console:pro image when production certification passes."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 774,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "GitHub credentials are user-scoped. Do not place TeXise server credentials in a terminal container. GitHub CLI authentication belongs to the current user/session and should use short-lived or revocable credentials where possible. Terminal command/output logging must not record authentication secrets."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 778,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "Using Git in TeXise Terminal does not change TeXise local-first storage semantics. A browser or linked-folder project reaches the terminal only after an explicit Send project action.', NULL FROM cms_docs WHERE slug = 'terminal-git-github'"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 783,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "SELECT id, 'The TeXise Terminal file browser is confined to the current session /workspace."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 787,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "**Send project** reads the current TeXise project in the browser and explicitly copies those files to the server session. Upload size, file count and workspace quotas are enforced by both the trusted API and Console Gateway."
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 857,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "WHERE slug = 'linux-terminal-pro' AND title = 'TeXise Terminal · Pro'`,"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 863,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'TeXise Terminal · Pro',"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 873,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "AND c.content_markdown LIKE '%TeXise Terminal · Pro%'`,"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1021,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "VALUES ('ollama', 'Using Ollama with TeXise', 'AI', 20, 'published', CURRENT_TIMESTAMP)"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1041,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "AND c.content_markdown LIKE 'Paper Memory lets TeXise answer and review with evidence from papers you explicitly add%'`,"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1130,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "VALUES (1, 'Change log', 'Recent improvements, fixes and new capabilities in TeXise.', 'Recent improvements, fixes and new capabilities in TeXise.')`,"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1132,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "SELECT 'Ollama local and cloud AI', 'TeXise can connect to Ollama running on your computer, distinguish local and Ollama Cloud-backed models, and apply Privacy Mode according to where inference runs.', NULL, '2026-08-29', 'published', CURRENT_TIMESTAMP(3)"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1135,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "SELECT 'Instant Live PDF preview', 'Eligible LaTeX text edits can appear immediately in Live PDF while TeXise reconciles the exact PDF in the background. The exact compiled PDF and SyncTeX remain authoritative.', NULL, '2026-08-28', 'published', CURRENT_TIMESTAMP(3)"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1138,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "SELECT 'Configurable Free project limit', 'The Free project limit is centrally configurable by the TeXise administrator while pricing, documentation and entitlement gates continue to use the same canonical value.', NULL, '2026-08-28', 'published', CURRENT_TIMESTAMP(3)"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1156,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "SELECT 'Ollama local access is now on demand', 'TeXise no longer probes localhost during passive app startup or when you simply open the AI Assistant or AI Settings. Browser Local Network Access is requested only after you choose Ollama, refresh its models, or make an AI request while Ollama is already selected.', NULL, '2026-08-29', 'published', CURRENT_TIMESTAMP(3)"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1625,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'Joining an invited collaboration does not require a TeXise login.',"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1628,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "AND c.content_markdown LIKE '%Joining an invited collaboration does not require a TeXise login.%'`,"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1643,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'A new TeXise Terminal workspace starts empty. Select **Send project** to explicitly copy the current project files into /workspace. Opening the terminal never silently uploads a linked folder or browser project.',"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1649,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'Using Git in TeXise Terminal does not change TeXise local-first storage semantics. A browser or linked-folder project reaches the terminal only after an explicit Send project action.',"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1655,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'**Send project** reads the current TeXise project in the browser and explicitly copies those files to the server session.',"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1658,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "AND c.content_markdown LIKE '%**Send project** reads the current TeXise project%'`,"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 1839,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "throw new Error(`TeXise SaaS migration cannot create a unique index because legacy ${table}.${column} contains duplicate non-empty values.`);"
    },
    {
      "path": "server/saas-migrations.mjs",
      "line": 2735,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "WHERE cover_image_url LIKE '/texise-media/%'`);"
    },
    {
      "path": "server/saas-migrations.node.test.mjs",
      "line": 319,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.match(sql, /\\{\\{TEXISE_FREE_PLAN_LIMIT\\}\\}/u);"
    },
    {
      "path": "server/saas-router.mjs",
      "line": 702,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "// texise.service runs with UMask=0027, so a requested 0644 file would"
    },
    {
      "path": "server/saas-router.mjs",
      "line": 922,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "content_html: renderSafeMarkdown(String(row.content_markdown || '').replaceAll('{{TEXISE_FREE_PLAN_LIMIT}}', String(config?.freePlanProjectLimit || 5))),"
    },
    {
      "path": "server/saas-router.mjs",
      "line": 938,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "return String(markdown || '').replaceAll('{{TEXISE_FREE_PLAN_LIMIT}}', String(config?.freePlanProjectLimit || 5));"
    },
    {
      "path": "server/saas-router.mjs",
      "line": 1093,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (coverImageUrl && !/^\\/texise-media\\/blog\\/[A-Za-z0-9-]+\\.(?:png|jpg|webp)$/u.test(coverImageUrl)) throw statusError('invalid_cover_image_url');"
    },
    {
      "path": "server/saas-router.mjs",
      "line": 1195,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "[`deleted+${id}@invalid.texise.local`, id],"
    },
    {
      "path": "server/saas-router.node.test.mjs",
      "line": 21,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "publicUrl: 'https://www.texise.com',"
    },
    {
      "path": "server/saas-router.node.test.mjs",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "auditFile: '/tmp/texise-cloud-compile-router-test.json',"
    },
    {
      "path": "server/saas-router.node.test.mjs",
      "line": 85,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "if (/FROM cms_docs d JOIN cms_doc_content/u.test(sql)) return [{ id: 9, slug: 'plans-and-features', title: 'Plans', category: 'Account', sort_order: 1, updated_at: '2026-08-28', content_markdown: 'Free supports up to {{TEXISE_FREE_PLAN_LIMIT}} projects.' }];"
    },
    {
      "path": "server/saas-router.node.test.mjs",
      "line": 96,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "assert.doesNotMatch(JSON.parse(response.body).item.content_html, /TEXISE_FREE_PLAN_LIMIT/u);"
    },
    {
      "path": "server/saas-router.node.test.mjs",
      "line": 118,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "headers: { origin: 'https://www.texise.com', 'sec-fetch-site': 'same-origin' },"
    },
    {
      "path": "server/saas-router.node.test.mjs",
      "line": 277,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "cookie: 'texise_session=session-test',"
    },
    {
      "path": "server/saas-router.node.test.mjs",
      "line": 281,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "'x-texise-csrf': csrf,"
    },
    {
      "path": "server/saas-router.node.test.mjs",
      "line": 391,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "delete req.headers['x-texise-csrf'];"
    },
    {
      "path": "server/saas-security.mjs",
      "line": 7,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "export const SESSION_COOKIE = 'texise_session';"
    },
    {
      "path": "server/saas-security.mjs",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const CSRF_HEADER = 'x-texise-csrf';"
    },
    {
      "path": "server/saas-security.mjs",
      "line": 224,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "if (/^\\/(?:learnitive-media|texise-media)\\/(?:blog|docs)\\/[A-Za-z0-9-]+\\.(?:png|jpg|webp)$/u.test(href)) return href;"
    },
    {
      "path": "server/server.mjs",
      "line": 86,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "return async function texiseRequestHandler(request, response) {"
    },
    {
      "path": "server/server.mjs",
      "line": 125,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if (url.pathname === '/__texise/render' || url.pathname.startsWith('/__texise/render/')) {"
    },
    {
      "path": "server/server.mjs",
      "line": 132,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const prefix = '/__texise/render';"
    },
    {
      "path": "server/server.mjs",
      "line": 169,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "service: 'texise',"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 34,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "const directory = await mkdtemp(join(tmpdir(), 'texise-license-server-'));"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 40,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "const licenseKey = 'TEXISE-PRO-SERVER-TEST';"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 49,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "TEXISE_LICENSE_KEYS_FILE: licensePath,"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 50,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_PRIVATE_KEY: privatePath,"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 51,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_PUBLIC_KEY: publicPath,"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 52,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_REFRESH_KEY: refreshPath,"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 73,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('TeXise server', () => {"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 79,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(config.publicUrl).toBe('https://www.texise.com');"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 95,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_PUBLIC_URL: 'https://override.example.test',"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 109,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const directory = await mkdtemp(join(tmpdir(), 'texise-config-'));"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 121,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_CONFIG_FILE: configPath,"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 129,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "expect(() => loadTexiseConfig({ TEXISE_PORT: '70000' })).toThrow("
    },
    {
      "path": "server/server.spec.mjs",
      "line": 130,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'Invalid TEXISE_PORT',"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 132,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "expect(() => loadTexiseConfig({ TEXISE_PORT: '3100abc' })).toThrow("
    },
    {
      "path": "server/server.spec.mjs",
      "line": 133,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'Invalid TEXISE_PORT',"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 135,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "expect(() => loadTexiseConfig({ TEXISE_SIGNALING_PORT: 'nope' })).toThrow("
    },
    {
      "path": "server/server.spec.mjs",
      "line": 136,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "'Invalid TEXISE_SIGNALING_PORT',"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 142,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "loadTexiseConfig({ TEXISE_PUBLIC_URL: 'file:///etc/passwd' }),"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 143,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": ").toThrow('Invalid TEXISE_PUBLIC_URL protocol');"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 155,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "service: 'texise',"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 163,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const directory = await mkdtemp(join(tmpdir(), 'texise-server-'));"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 168,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "TEXISE_ENTITLEMENT_PUBLIC_KEY: publicKeyPath,"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 189,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(activation.entitlement).toMatch(/^texise1\\./);"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 200,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(refresh.entitlement).toMatch(/^texise1\\./);"
    },
    {
      "path": "server/server.spec.mjs",
      "line": 234,
      "category": "compatibility-migration",
      "rationale": "legacy deployment path or administrator identity retained for migration",
      "text": "const response = await fetch(`${baseUrl}/etc/texise/texise.env`);"
    },
    {
      "path": "server/signaling.mjs",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LIVE_MAX_ROOMS = Math.max(16, Number(process.env.TEXISE_COLLAB_MAX_ROOMS) || 256);"
    },
    {
      "path": "server/signaling.mjs",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LIVE_MAX_TOTAL_CONNECTIONS = Math.max(32, Number(process.env.TEXISE_COLLAB_MAX_CONNECTIONS) || 1024);"
    },
    {
      "path": "server/signaling.mjs",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LIVE_MAX_CONNECTIONS_PER_IP = Math.max(4, Number(process.env.TEXISE_COLLAB_MAX_CONNECTIONS_PER_IP) || 48);"
    },
    {
      "path": "server/signaling.mjs",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LIVE_MAX_NEW_ROOMS_PER_IP_PER_MINUTE = Math.max(1, Number(process.env.TEXISE_COLLAB_MAX_NEW_ROOMS_PER_IP_PER_MINUTE) || 20);"
    },
    {
      "path": "server/signaling.mjs",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const LIVE_MAX_DOC_BYTES = Math.max(1 * 1024 * 1024, Number(process.env.TEXISE_COLLAB_MAX_DOC_BYTES) || 32 * 1024 * 1024);"
    },
    {
      "path": "server/signaling.mjs",
      "line": 586,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "service: path.startsWith('/collab-live') ? 'texise-collaboration-live' : 'texise-collaboration-signaling',"
    },
    {
      "path": "server/signaling.spec.mjs",
      "line": 170,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "provider.awareness.setLocalStateField('texiseSession', {"
    },
    {
      "path": "server/signaling.spec.mjs",
      "line": 199,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "describe('TeXise collaboration signaling', () => {"
    },
    {
      "path": "server/signaling.spec.mjs",
      "line": 204,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(await response.json()).toEqual({ status: 'ok', service: 'texise-collaboration-signaling' });"
    },
    {
      "path": "server/signaling.spec.mjs",
      "line": 207,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "expect(await liveResponse.json()).toMatchObject({ status: 'ok', service: 'texise-collaboration-live', activeRooms: 0 });"
    },
    {
      "path": "server/signaling.spec.mjs",
      "line": 269,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "(state) => state?.texiseSession?.role === 'host' && state.texiseSession.hostSessionId === hostSessionId,"
    },
    {
      "path": "server/signaling.spec.mjs",
      "line": 453,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const { port } = await start({ publicUrl: 'https://www.texise.com' });"
    },
    {
      "path": "server/startup-diagnostics.node.test.mjs",
      "line": 6,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const config = { saas: { mysql: { database: 'texise_db' } } };"
    },
    {
      "path": "server/startup-diagnostics.node.test.mjs",
      "line": 9,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const result = describeStartupFailure(Object.assign(new Error(\"Unknown database 'texise_db'\"), { code: 'ER_BAD_DB_ERROR' }), config);"
    },
    {
      "path": "server/startup-diagnostics.node.test.mjs",
      "line": 11,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.match(result.hint, /texise_db/u);"
    },
    {
      "path": "server/startup-diagnostics.node.test.mjs",
      "line": 16,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const result = describeStartupFailure(Object.assign(new Error(\"Access denied for user 'texise_app'@'localhost' (using password: YES)\"), { code: 'ER_ACCESS_DENIED_ERROR' }), config);"
    },
    {
      "path": "server/template-library.mjs",
      "line": 25,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "export const TEMPLATE_PROVENANCE = Object.freeze(['official', 'adapted', 'community', 'texise']);"
    },
    {
      "path": "server/template-library.mjs",
      "line": 177,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "const provenance = text(input.provenance || 'texise', 'provenance', 32).toLowerCase();"
    },
    {
      "path": "server/template-library.mjs",
      "line": 750,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const stage = await mkdtemp(path.join(os.tmpdir(), 'texise-template-'));"
    },
    {
      "path": "server/template-library.mjs",
      "line": 848,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const stage = await mkdtemp(path.join(root, '.texise-delete-'));"
    },
    {
      "path": "server/template-library.node.test.mjs",
      "line": 38,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const root = await mkdtemp(path.join(os.tmpdir(), 'texise-template-test-'));"
    },
    {
      "path": "server/template-library.node.test.mjs",
      "line": 39,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const publicParent = await mkdtemp(path.join(os.tmpdir(), 'texise-template-public-'));"
    },
    {
      "path": "server/template-library.node.test.mjs",
      "line": 40,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const publicCopy = path.join(publicParent, 'texise-templates');"
    },
    {
      "path": "server/template-library.node.test.mjs",
      "line": 91,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.ok(!JSON.stringify(manifest).includes('/texise-templates/free/'));"
    },
    {
      "path": "server/template-library.node.test.mjs",
      "line": 236,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const f = await fixture(); const src = await mkdtemp(path.join(os.tmpdir(), 'texise-template-zip-src-')); try {"
    },
    {
      "path": "server/template-library.node.test.mjs",
      "line": 276,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const f = await fixture(); const first = await mkdtemp(path.join(os.tmpdir(), 'texise-template-replace-first-')); const second = await mkdtemp(path.join(os.tmpdir(), 'texise-template-replace-second-')); try {"
    },
    {
      "path": "server/template-library.node.test.mjs",
      "line": 299,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const f = await fixture(); const first = await mkdtemp(path.join(os.tmpdir(), 'texise-template-duplicate-first-')); const second = await mkdtemp(path.join(os.tmpdir(), 'texise-template-duplicate-second-')); try {"
    },
    {
      "path": "server/template-library.node.test.mjs",
      "line": 317,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const f = await fixture(); const src = await mkdtemp(path.join(os.tmpdir(), 'texise-template-ambiguous-src-')); try {"
    },
    {
      "path": "server/template-library.node.test.mjs",
      "line": 339,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "const f = await fixture(); const src = await mkdtemp(path.join(os.tmpdir(), 'texise-template-delete-draft-src-')); try {"
    },
    {
      "path": "server/template-library.node.test.mjs",
      "line": 353,
      "category": "source-history-internal-note",
      "rationale": "test/history/planning material",
      "text": "assert.equal((await readdir(f.root)).some((name) => name.startsWith('.texise-delete-')), false);"
    },
    {
      "path": "server/template-manifest.mjs",
      "line": 17,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const DEFAULT_SOURCE_ROOT = path.resolve(process.env.TEXISE_SOURCE_ROOT || MODULE_PROJECT_ROOT);"
    },
    {
      "path": "server/template-manifest.mjs",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const DEFAULT_TEMPLATE_ROOT = path.resolve(process.env.LEARNITIVE_TEMPLATE_ROOT || process.env.TEXISE_TEMPLATE_ROOT || path.join(DEFAULT_SOURCE_ROOT, 'texise-templates'));"
    },
    {
      "path": "server/template-manifest.mjs",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "export const DEFAULT_TEMPLATE_PUBLIC_COPY = path.resolve(process.env.LEARNITIVE_TEMPLATE_PUBLIC_COPY || process.env.TEXISE_TEMPLATE_PUBLIC_COPY || path.join(DEFAULT_SOURCE_ROOT, 'packages/tooling/browser-entry/public/texise-templates'));"
    },
    {
      "path": "server/template-manifest.mjs",
      "line": 268,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "provenance: cleanString(metadata.provenance, 'texise', 'provenance', 32),"
    },
    {
      "path": "server/template-manifest.mjs",
      "line": 341,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "// texise.service deliberately runs with UMask=0027, while Apache serves this"
    },
    {
      "path": "server/validate-template-library.mjs",
      "line": 8,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const root=path.resolve(arg('root', process.env.LEARNITIVE_TEMPLATE_ROOT || process.env.TEXISE_TEMPLATE_ROOT || 'texise-templates'));"
    },
    {
      "path": "server/validate-template-library.mjs",
      "line": 9,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const publicCopy=path.resolve(arg('public-copy', process.env.LEARNITIVE_TEMPLATE_PUBLIC_COPY || process.env.TEXISE_TEMPLATE_PUBLIC_COPY || 'dist/texise-templates'));"
    },
    {
      "path": "texise-services/cloud-compile/package-lock.json",
      "line": 2,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"name\": \"texise-latex-compile-service\","
    },
    {
      "path": "texise-services/cloud-compile/package-lock.json",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"name\": \"texise-latex-compile-service\","
    },
    {
      "path": "texise-services/cloud-compile/package.json",
      "line": 2,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"name\": \"texise-latex-compile-service\","
    },
    {
      "path": "texise-services/cloud-compile/server.js",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const DOCKER_IMAGE = process.env.COMPILE_DOCKER_IMAGE || process.env.LEARNITIVE_DEVELOPMENT_IMAGE || process.env.TEXISE_CLOUD_COMPILE_IMAGE || 'learnitive/development:2026.08';"
    },
    {
      "path": "texise-services/cloud-compile/server.js",
      "line": 116,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "jobDir = await mkdtemp(path.join(WORK_ROOT, `texise-compile-${jobId}-`));"
    },
    {
      "path": "texise-services/cloud-compile/server.js",
      "line": 369,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "return `texise-${String(jobId).replace(/[^a-zA-Z0-9_.-]/gu, '').slice(0, 40)}-${String(phase).replace(/[^a-zA-Z0-9_.-]/gu, '').slice(0, 24)}`;"
    },
    {
      "path": "texise-services/cloud-compile/server.js",
      "line": 470,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "await Promise.all(entries.filter((entry) => entry.isDirectory() && entry.name.startsWith('texise-compile-')).map(async (entry) => {"
    },
    {
      "path": "texise-services/console-gateway/package-lock.json",
      "line": 2,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"name\": \"texise-console-gateway\","
    },
    {
      "path": "texise-services/console-gateway/package-lock.json",
      "line": 8,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"name\": \"texise-console-gateway\","
    },
    {
      "path": "texise-services/console-gateway/package.json",
      "line": 2,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "\"name\": \"texise-console-gateway\","
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 14,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const SECRET = String(process.env.LEARNITIVE_CONSOLE_GATEWAY_SECRET || process.env.TEXISE_CONSOLE_GATEWAY_SECRET || '').trim();"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 15,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const IMAGE = String(process.env.LEARNITIVE_CONSOLE_IMAGE || process.env.LEARNITIVE_DEVELOPMENT_IMAGE || process.env.TEXISE_CONSOLE_IMAGE || 'learnitive/development:2026.08').trim();"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 16,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const DOCKER = process.env.LEARNITIVE_CONSOLE_DOCKER_BIN || process.env.TEXISE_CONSOLE_DOCKER_BIN || '/usr/bin/docker';"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 17,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const NETWORK = process.env.LEARNITIVE_CONSOLE_NETWORK || process.env.TEXISE_CONSOLE_NETWORK || 'learnitive-os-egress';"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 18,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MEMORY = process.env.LEARNITIVE_CONSOLE_MEMORY || process.env.TEXISE_CONSOLE_MEMORY || '2g';"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 19,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const CPUS = process.env.LEARNITIVE_CONSOLE_CPUS || process.env.TEXISE_CONSOLE_CPUS || '2';"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 20,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const PIDS_LIMIT = String(boundedInt(process.env.LEARNITIVE_CONSOLE_PIDS_LIMIT || process.env.TEXISE_CONSOLE_PIDS_LIMIT, 256, 32, 4096));"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 21,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const HOME_SIZE = process.env.LEARNITIVE_CONSOLE_HOME_SIZE || process.env.TEXISE_CONSOLE_HOME_SIZE || '768m';"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 22,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TMP_SIZE = process.env.LEARNITIVE_CONSOLE_TMP_SIZE || process.env.TEXISE_CONSOLE_TMP_SIZE || '512m';"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 23,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const WORK_ROOT = process.env.LEARNITIVE_CONSOLE_WORK_DIR || process.env.TEXISE_CONSOLE_WORK_DIR || '/var/www/os.learnitive.com/learnitive-data/tmp/console';"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 24,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const SESSION_SECONDS = boundedInt(process.env.LEARNITIVE_CONSOLE_SESSION_SECONDS || process.env.TEXISE_CONSOLE_SESSION_SECONDS, 4 * 60 * 60, 300, 24 * 60 * 60);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 25,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const IDLE_SECONDS = boundedInt(process.env.LEARNITIVE_CONSOLE_IDLE_SECONDS || process.env.TEXISE_CONSOLE_IDLE_SECONDS, 30 * 60, 60, 8 * 60 * 60);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 26,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const TOKEN_SECONDS = boundedInt(process.env.LEARNITIVE_CONSOLE_TOKEN_SECONDS || process.env.TEXISE_CONSOLE_TOKEN_SECONDS, 5 * 60, 30, 30 * 60);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 27,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_SESSIONS = boundedInt(process.env.LEARNITIVE_CONSOLE_MAX_SESSIONS || process.env.TEXISE_CONSOLE_MAX_SESSIONS, 8, 1, 128);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 28,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_SESSIONS_PER_USER = boundedInt(process.env.LEARNITIVE_CONSOLE_MAX_SESSIONS_PER_USER || process.env.TEXISE_CONSOLE_MAX_SESSIONS_PER_USER, 2, 1, 16);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 29,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_FILES = boundedInt(process.env.LEARNITIVE_CONSOLE_MAX_FILES || process.env.TEXISE_CONSOLE_MAX_FILES, 1000, 1, 5000);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 30,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_UPLOAD_BYTES = boundedInt(process.env.LEARNITIVE_CONSOLE_MAX_UPLOAD_BYTES || process.env.TEXISE_CONSOLE_MAX_UPLOAD_BYTES, 50_000_000, 1024, 500_000_000);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 31,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_DOWNLOAD_BYTES = boundedInt(process.env.LEARNITIVE_CONSOLE_MAX_DOWNLOAD_BYTES || process.env.TEXISE_CONSOLE_MAX_DOWNLOAD_BYTES, 100_000_000, 1024, 1_000_000_000);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 32,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const MAX_WORKSPACE_BYTES = boundedInt(process.env.LEARNITIVE_CONSOLE_MAX_WORKSPACE_BYTES || process.env.TEXISE_CONSOLE_MAX_WORKSPACE_BYTES, 1_000_000_000, 1_000_000, 20_000_000_000);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 33,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const RATE_LIMIT_PER_MINUTE = boundedInt(process.env.LEARNITIVE_CONSOLE_RATE_LIMIT_PER_MINUTE || process.env.TEXISE_CONSOLE_RATE_LIMIT_PER_MINUTE, 120, 1, 5000);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 34,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const RATE_BUCKET_CAP = boundedInt(process.env.LEARNITIVE_CONSOLE_RATE_BUCKET_CAP || process.env.TEXISE_CONSOLE_RATE_BUCKET_CAP, 1000, 10, 100000);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 35,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const QUOTA_CHECK_SECONDS = boundedInt(process.env.LEARNITIVE_CONSOLE_QUOTA_CHECK_SECONDS || process.env.TEXISE_CONSOLE_QUOTA_CHECK_SECONDS, 5, 2, 60);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 36,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const CONTAINER_UID = String(process.env.LEARNITIVE_CONSOLE_UID || process.env.TEXISE_CONSOLE_UID || process.getuid?.() || 10001);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 37,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "const CONTAINER_GID = String(process.env.LEARNITIVE_CONSOLE_GID || process.env.TEXISE_CONSOLE_GID || process.getgid?.() || 10001);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 40,
      "category": "compatibility-migration",
      "rationale": "legacy state/configuration compatibility",
      "text": "console.error('LEARNITIVE_CONSOLE_GATEWAY_SECRET is required (legacy TEXISE_CONSOLE_GATEWAY_SECRET is accepted for migration).');"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 203,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "if (!containerName || !/^(?:learnitive|texise)-console-[a-f0-9-]+$/u.test(containerName)) return;"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 427,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const wss = new WebSocketServer({noServer: true, maxPayload: 256 * 1024, handleProtocols: (protocols) => protocols.has('learnitive-console') ? 'learnitive-console' : protocols.has('texise-console') ? 'texise-console' : false});"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 434,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const authProtocol = protocols.find((value) => value.startsWith('learnitive-auth.')) || protocols.find((value) => value.startsWith('texise-auth.'));"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 435,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "if ((!protocols.includes('learnitive-console') && !protocols.includes('texise-console')) || !authProtocol) throw new Error('Missing websocket authorization');"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 436,
      "category": "legacy-identifier",
      "rationale": "internal package/CSS/path/storage identifier",
      "text": "const token = authProtocol.startsWith('learnitive-auth.') ? authProtocol.slice('learnitive-auth.'.length) : authProtocol.slice('texise-auth.'.length);"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 442,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "req.texiseConsoleSession = session;"
    },
    {
      "path": "texise-services/console-gateway/server.js",
      "line": 451,
      "category": "legacy-identifier",
      "rationale": "lower-case internal package/CSS/storage/protocol identifier",
      "text": "const session = req.texiseConsoleSession;"
    },
    {
      "path": "texise-templates/free/blank-article/template.json",
      "line": 22,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "\"provenance\": \"texise\","
    },
    {
      "path": "texise-templates/templates.json",
      "line": 45,
      "category": "legal-attribution",
      "rationale": "legal/provenance text",
      "text": "\"provenance\": \"texise\","
    }
  ]
}
