From 2f10086e03d0e2403e9a51dc6f811f6a1c9d006a Mon Sep 17 00:00:00 2001 From: Michael Johnston Date: Sun, 30 Aug 2026 14:29:32 -0700 Subject: [PATCH 1/5] polish public preview copy --- README.md | 43 +++++++++++++-------- doc/launch/issue-16/README.md | 4 ++ doc/launch/issue-16/demo-storyboard.md | 13 ++----- doc/launch/issue-16/demo-transcript.md | 20 ++++++---- doc/launch/issue-16/focused-preview-copy.md | 32 ++++++++------- docs/user/agents/index.html | 21 ++++++---- docs/user/compatibility/index.html | 3 +- docs/user/guide/index.html | 10 ++--- docs/user/index.html | 33 +++++++++------- docs/user/limitations/index.html | 4 +- docs/user/privacy/index.html | 12 +++--- docs/user/remote-access/index.html | 4 +- 12 files changed, 115 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index b699d9f1..ab402e11 100644 --- a/README.md +++ b/README.md @@ -14,13 +14,16 @@ For agents

-Markover is an **Early macOS preview** for reviewing Markdown as a document -tree and returning block-level feedback to an agent. It is free and -MIT-licensed, requires no account, and keeps ordinary review data in your -macOS account. +Markover is a macOS app for reviewing Markdown as a document tree and +returning block-level feedback to an agent. Instead of quoting fragments back +into chat, feedback stays attached to the blocks it concerns, and the agent +retrieves the whole review in a single structured handoff. + +Markover is in **early preview**. It is free and MIT-licensed, requires no +account, and keeps review data on your Mac.

- Markover in Ember Light showing the review inbox, a launch brief in the center document tree, and precise feedback with two labeled attachments. + Markover in Ember Light showing the review inbox, a launch brief in the center document tree, and an annotation with two labeled attachments.

## Features @@ -35,6 +38,14 @@ macOS account. - One-shot agent handoff containing the exact source, checksum, document tree, annotations, attachments, and review context. +## Try it + +Ask your agent to open a Markdown document in Markover (the command it needs +is below), review the document, then tell the agent "Check Markover." To +review a document without an agent, choose **File → Open Markdown…** in the +app. The [user guide](https://lastobelus.github.io/markover/guide/) covers the +full workflow and keyboard controls. + ## Before you try the early preview - Markover supports macOS 14 Sonoma or newer on Apple Silicon Macs. Native @@ -44,7 +55,8 @@ macOS account. notarized. macOS is expected to block the first launch. - Ordinary review work stays in your macOS account. Markover has no telemetry, analytics, cloud sync, or automatic review upload. -- Unreleased prototype formats may change directly. Released review schemas +- Data formats from unreleased prototype builds may change without migration + support. Released review schemas are converted automatically with an original backup; unknown future versions remain untouched until a compatible Markover release opens them. Back up important review data before changing versions. @@ -70,13 +82,12 @@ The public npm package named `markover` is unrelated to this project. Use the exact GitHub release-package URL above. The command downloads the Apple Silicon app on first use. Native Intel releases -are deferred to the Broad announcement roadmap in -[issue #80](https://github.com/lastobelus/markover/issues/80). -Release launchers produced from the hardened preflight verify its checksum, -bundle identity, version, architecture, Sonoma floor, ad-hoc signature, and -code seal before moving it into the cache. Later commands reuse that validated -version. The launcher returns a review ID, status, and OS-openable custom URL, -then exits without waiting for the review: +are deferred; see [issue #80](https://github.com/lastobelus/markover/issues/80). +The launcher verifies the download's checksum, bundle identity, version, +architecture, minimum macOS version, ad-hoc signature, and code seal before +caching it. Later commands reuse that validated version. The launcher returns +a review ID, a status, and a `markover://` URL that macOS can open, then exits +without waiting for the review: ```json {"reviewId":"mko_8f3a2c","status":"editing","reviewUrl":"markover://review/mko_8f3a2c"} @@ -88,8 +99,8 @@ put the reliable Terminal fallback on its own line: `open 'markover://review/mko_8f3a2c'` -Custom-scheme Markdown links depend on the thread-host; T3 Code and the Codex app do not -currently dispatch them. Then stop. See the dedicated [agent +Some chat apps, including T3 Code and the Codex app, do not currently open +custom-scheme links from Markdown. Then stop. See the dedicated [agent workflow](https://lastobelus.github.io/markover/agents/) for retrieval, reopening, and interpretation guidance. @@ -131,4 +142,4 @@ operations. - [Discussions](https://github.com/lastobelus/markover/discussions) for early ideas, usage questions, and general support - [Report a problem](https://github.com/lastobelus/markover/issues/new?template=bug.yml) - with the smallest sanitized reproduction of a defect + with the smallest sanitized reproduction diff --git a/doc/launch/issue-16/README.md b/doc/launch/issue-16/README.md index a5b0e04d..91d6656a 100644 --- a/doc/launch/issue-16/README.md +++ b/doc/launch/issue-16/README.md @@ -71,6 +71,10 @@ Before publishing any visual: paths, credentials, authorization material, or unrelated application chrome; - run the deterministic checks documented by the media PR before upload. +No canonical review, private path, real repository, real pull request, real +thread identity, credential, notification, unrelated application chrome, or +incidental audio may appear in any published still or recording. + The marker file is the deletion boundary. The staging command refuses to replace an unmarked directory, a symlink, or a fixture whose capture service is still running. diff --git a/doc/launch/issue-16/demo-storyboard.md b/doc/launch/issue-16/demo-storyboard.md index 94acecbe..4cc8f99c 100644 --- a/doc/launch/issue-16/demo-storyboard.md +++ b/doc/launch/issue-16/demo-storyboard.md @@ -29,7 +29,7 @@ Select the heading and reveal its feedback with the two fixture-owned images, **workflow overview** and **annotation details**. Keep their rewritten Markdown references visible long enough to read. -Caption: **Attach labeled visual context to one exact block.** +Caption: **Attach labeled screenshots to a single block.** ### 0:15–0:25 — Inspect an exact source change @@ -68,11 +68,6 @@ MIT-licensed macOS early preview**, and `github.com/lastobelus/markover`. ## Pages transcript -Markover opens a sanitized launch brief in an Ember Light review inbox. The -reviewer selects one Markdown block, adds precise feedback, and keeps two -labeled images attached to that context. On the opening paragraph, Markover -shows an exact source proposal as a word-level diff without changing the source -document. The reviewer switches to All annotations to scan the complete review, -then returns to the agent's terminal. One fixture-only command retrieves a -structured handoff containing the feedback, attachment labels, and source -proposal. +Pages uses the text of [demo-transcript.md](demo-transcript.md) verbatim. Do +not maintain a separate transcript here; update that file and sync the site's +inline copy when the demo is re-exported. diff --git a/doc/launch/issue-16/demo-transcript.md b/doc/launch/issue-16/demo-transcript.md index e82b3c3c..ff12aa16 100644 --- a/doc/launch/issue-16/demo-transcript.md +++ b/doc/launch/issue-16/demo-transcript.md @@ -2,20 +2,24 @@ The 44-second silent demo uses burned-in captions and only invented fixture data. +This file is the canonical transcript. The inline transcript on the Pages demo +section must match it verbatim; update both together when the demo changes. + Markover starts with a sanitized participant guide, then opens the -launch-readiness review from the **Needs me** inbox. The current Ember Light -App header and Left, Center, and Right panes establish the review. The reviewer -sees agent-written Markdown as a document tree with precise feedback and two -labeled images attached to one heading. +launch-readiness review from the **Needs me** inbox. The Ember Light theme's +three-pane layout establishes the review. The reviewer sees agent-written +Markdown as a document tree with feedback and two labeled images attached to +one heading. On the opening paragraph, Markover displays an exact word-level source proposal without changing the source document. The reviewer switches to **Projects** and **All annotations** to scan the complete review. -Finally, the fixture-only CLI returns structured JSON containing the review -status, block feedback, attachment IDs and labels, and source proposal. The demo -ends on the canonical Markover lockup, “Structured review for Markdown,” the -free, MIT-licensed macOS early-preview boundary, and the repository address. +Finally, the CLI (running against demo fixture data) returns structured JSON +containing the review status, block feedback, attachment IDs and labels, and +source proposal. The demo ends on the Markover lockup, “Structured review for +Markdown,” the free, MIT-licensed macOS early-preview boundary, and the +repository address. No canonical review, private path, real repository, real pull request, real thread identity, credential, notification, unrelated application chrome, or diff --git a/doc/launch/issue-16/focused-preview-copy.md b/doc/launch/issue-16/focused-preview-copy.md index 7a64876f..74325f08 100644 --- a/doc/launch/issue-16/focused-preview-copy.md +++ b/doc/launch/issue-16/focused-preview-copy.md @@ -7,31 +7,37 @@ different useful question. ## Coding-agent community -I’m preparing an early macOS preview of Markover, a free MIT-licensed, -local-first app for reviewing agent-written Markdown block by block. It needs -no account: ordinary review data stays in your macOS account. I’m looking for -Codex and coding-agent users willing to test one real document review and -report where the open → annotate → structured handoff loop breaks down—not for -stars. Apple Silicon macOS 14+ only for this preview. [Watch the 44-second +I’m preparing an early macOS preview of Markover, a free, MIT-licensed app +for reviewing agent-written Markdown block by block. It needs no account, and +review data stays on your Mac. I’m looking for Codex and coding-agent users +willing to test one real document review and report where the +open → annotate → structured handoff loop breaks down. Apple Silicon +macOS 14+ only for this preview. [Watch the 44-second workflow](https://lastobelus.github.io/markover/#demo). ## Design-partner invitation Could you try one document you already ask an agent to write, then review it in Markover instead of flattening feedback into chat? The early macOS preview -is free, MIT licensed, local-first, and requires no account. I most need the +is free, MIT licensed, requires no account, and keeps review data on your Mac. I most need the exact moment the workflow becomes slower or less clear than your current process, plus any feedback the agent misinterprets after retrieval. Apple Silicon macOS 14+ only. [Setup and limitations](https://lastobelus.github.io/markover/guide/). ## GitHub repository summary -Markover is a local-first macOS app for reviewing agent-produced Markdown and -returning structured, block-level feedback to the agent thread. The early -preview is free and MIT licensed, requires no account, and currently supports -Apple Silicon macOS 14+. Start with the [current UI and 44-second -demo](https://lastobelus.github.io/markover/#demo), then report concrete -workflow failures in [Discussions](https://github.com/lastobelus/markover/discussions). +Markover is a macOS app for reviewing agent-produced Markdown and returning +structured, block-level feedback to the agent thread. The early preview is +free and MIT licensed, requires no account, keeps review data on your Mac, and +currently supports Apple Silicon macOS 14+. Start with the [current UI and +44-second demo](https://lastobelus.github.io/markover/#demo), then report +concrete workflow failures in [Discussions](https://github.com/lastobelus/markover/discussions). + +One-line variant for the repository About field, which does not render +Markdown links and truncates long descriptions: + +> macOS app for reviewing agent-written Markdown block by block and returning +> structured feedback to the agent. Early preview; Apple Silicon, macOS 14+. Before publishing any draft, issue #17 must replace staging language with the verified release tag, previous known-good release, rollback threshold, support diff --git a/docs/user/agents/index.html b/docs/user/agents/index.html index 59e63f39..f43c86be 100644 --- a/docs/user/agents/index.html +++ b/docs/user/agents/index.html @@ -104,19 +104,26 @@

Review a Markdown document with Markover

Open one review

-

Run markover help before a pull-request-associated open, get, get-for-review, revise, or done. Its machine-readable pullRequestStatus contract is the source of truth for the live GitHub lookup, status mapping, flags, and lookup-failure behavior.

-

Give Markover one Markdown path and a short summary of why the document exists and what feedback would help:

+

Give Markover a Markdown path and a short summary of why the document exists and what feedback would help:

npx --yes \
   --package=https://github.com/lastobelus/markover/releases/latest/download/markover-cli.tgz \
   markover open ./DOCUMENT.md \
   --summary "Review these decisions before implementation."
-

When reliable thread metadata is available, pass the best observable requesting-thread or session ID with --thread-id. Use --thread-host-kind for the user-facing product or lookup namespace where the user would look for the thread, and --thread-host-provider for the LLM provider or model family in use rather than an intermediate harness. Pass --thread-host-thread-id only for a distinct host-owned identifier. Try the local hostname command and pass its result as --thread-host-machine. Use recommended product values when they match observable facts, preserve truthful unknown values, and omit anything unavailable rather than guessing.

-

On first use, the launcher downloads the Apple Silicon app; verifies its checksum, bundle identity, version, architecture, Sonoma floor, ad-hoc signature, and code seal; then atomically caches it. A successful command exits promptly with one JSON value:

+

When reliable thread metadata is available:

+ +

On first use, the launcher downloads the Apple Silicon app; verifies its checksum, bundle identity, version, architecture, minimum macOS version, ad-hoc signature, and code seal; then atomically caches it. A successful command exits promptly with one JSON value:

{"reviewId":"mko_8f3a2c","status":"editing","reviewUrl":"markover://review/mko_8f3a2c"}
Retain the review ID. It is the stable identifier for every later operation on this review.

Give the reviewer all three opening aids: a best-effort [Open in Markover](<reviewUrl>) link, the raw review ID, and this Terminal fallback alone on its own line:

open 'markover://review/mko_8f3a2c'
-

Custom-scheme links work through macOS, but thread-hosts including T3 Code and the Codex app may strip or decline them. The standalone command is the reliable handoff.

+

Custom-scheme links work through macOS, but some chat apps, including T3 Code and the Codex app, do not currently open them from Markdown. The standalone command is the reliable handoff.

+
Pull-request-associated commands. Before an open, get, get-for-review, revise, or done that involves a pull request, run markover help. Its machine-readable pullRequestStatus contract defines the live GitHub lookup, status mapping, flags, and lookup-failure behavior.
@@ -185,7 +192,7 @@

Record the completed handoff

Check and resolve pending reviews

At any point, an agent can ask Markover for every unresolved review opened by its exact current requesting thread. The result contains review links, document purpose, responsibility, age timestamps, and pull-request association without exposing draft feedback or changing review state.

markover pending --thread-id THREAD_ID --thread-host-kind t3code --thread-host-provider codex
-

Pending reviews are a soft gate: planning and implementation can continue, but the agent surfaces every result before merge or final thread completion. Silence and merge do not imply acceptance.

+

Pending reviews are a soft gate: planning and implementation can continue, but the agent surfaces every result before merging or finishing the thread. Silence and merge do not imply acceptance.

markover resolve mko_8f3a2c --outcome reviewed-no-notes
 markover resolve mko_8f3a2c --outcome accepted-unreviewed
 markover unresolve mko_8f3a2c
@@ -208,7 +215,7 @@

Use an agent as the reviewer

# The reviewer updates feedback and permitted sourceEdit fields in review.json. markover submit mko_8f3a2c --input review.json

The review must be pristine when claimed: no existing feedback, attachments, or source proposals. The returned artifact contains dedicated reviewer instructions under review.agentReviewer.agentGuidance, the effective permission under review.agentReviewer.mode, and reviewer thread provenance when available. The agent returns the complete artifact as one atomic batch; Markover accepts all permitted findings or none.

-

While the agent is reviewing, the document is read only in Markover and labeled Agent reviewing. After submission it is labeled Reviewed, remains immutable, and appears in history. Markover shows a completion notice with an Open action, including explicit no-findings copy when the reviewer returned an empty result.

+

While the agent is reviewing, the document is read only in Markover and labeled Agent reviewing. After submission it is labeled Reviewed, remains immutable, and appears in history. Markover shows a completion notice with an Open action, including an explicit no-findings message when the reviewer returned an empty result.

diff --git a/docs/user/compatibility/index.html b/docs/user/compatibility/index.html index 593fdbec..4fd5f814 100644 --- a/docs/user/compatibility/index.html +++ b/docs/user/compatibility/index.html @@ -96,7 +96,8 @@

Current catalog

ArtifactVersionFirst compatible release markover-review1Not yet assigned; development under issue #99 -

The first release carrying portable v1 must replace the pending entry before publication. Later releases update this table whenever they introduce a review-format version.

+ +

Later releases update this table whenever they introduce a review-format version.

Tools can read the same information from the machine-readable catalog.

diff --git a/docs/user/guide/index.html b/docs/user/guide/index.html index 1f3772c8..a1f0e7d5 100644 --- a/docs/user/guide/index.html +++ b/docs/user/guide/index.html @@ -102,9 +102,9 @@

Getting started

Before you try the early preview

-

Markover is an Early macOS preview. It supports macOS 14 Sonoma or newer on Apple Silicon Macs and requires Node.js 22.13.0 or newer for the bootstrap command. Native Intel releases are deferred to the Broad announcement roadmap. You do not need to clone the repository or install an npm package globally.

+

Markover is in early preview. It supports macOS 14 Sonoma or newer on Apple Silicon Macs and requires Node.js 22.13.0 or newer for the launcher. Native Intel releases are deferred; see issue #80.

Not Apple-verified. Markover uses a hardened ad-hoc code signature, but it has no authenticated Developer ID publisher and is not notarized. Gatekeeper is expected to block its first launch.
-

Ordinary review work stays in your macOS account. Markover has no telemetry, analytics, cloud sync, or automatic review upload. Unreleased prototype formats may change directly. Released review schemas are converted automatically with an original backup; unknown future versions remain untouched until a compatible Markover release opens them.

+

Ordinary review work stays in your macOS account. Markover has no telemetry, analytics, cloud sync, or automatic review upload. Data formats from unreleased prototype builds may change without migration support. Released review schemas are converted automatically with an original backup; unknown future versions remain untouched until a compatible Markover release opens them.

Before relying on Markover, read Markdown support and preview limitations and Privacy, storage, and recovery. Advanced users can follow the tailnet-only Tailscale Serve example for a manually authorized remote client. Ask usage questions in GitHub Discussions.

@@ -112,7 +112,7 @@

Before you try the early preview

Start a review with an agent

Tell your agent which Markdown file you want to review and why the review is useful. The agent opens that file in Markover and gives you a review ID, a best-effort Open in Markover link, and a standalone Terminal command. You do not need to clone the repository, install an npm package globally, or run the agent's launcher command yourself.

To start without an agent, choose File → Open Markdown…. Markover creates a managed local review from the selected snapshot, saves feedback and attachments separately, and restores that review after restart. The original Markdown file is never changed or deleted.

-
If the link does not open. Copy the standalone open 'markover://…' command the agent provides, paste it into Terminal, and press Return. Some thread-hosts do not dispatch custom-scheme links directly. Markover focuses and follows Settings → Incoming reviews → When you open a review link; links switch immediately by default.
+
If the link does not open. Copy the standalone open 'markover://…' command the agent provides, paste it into Terminal, and press Return. Some chat apps do not open custom-scheme links directly. Whether Markover switches to the incoming review immediately is controlled by Settings → Incoming reviews → When you open a review link; the default is to switch immediately.
Keep the agent thread available. When your feedback is ready, return to the same conversation and say “Check Markover.”

Agents and tool authors should follow the separate agent workflow for exact commands, review-ID handling, and feedback interpretation.

@@ -139,7 +139,7 @@

Review the document

Durability and recovery

-

While Markover is responsive and local storage is healthy, managed review changes are durably saved within a two-second window by default. A normal quit first captures the latest editable reviews and finishes their saves. Exact agent handoffs and reopened reviews are committed before Markover reports success.

+

While Markover is responsive and local storage is healthy, managed review changes are durably saved within a two-second window by default. A normal quit first captures the latest editable reviews and finishes their saves. Agent handoffs and reopened reviews are fully saved before Markover reports success.

After an app crash or restart, Markover restores both reviews still being edited and reviews already inflight with an agent. You do not need to retrieve or drain agent reviews before restarting. Attachment bytes are flushed before saved review JSON can refer to them; a crash can leave harmless unreferenced attachment bytes, but not a durable broken reference.

What the two-second window does not cover. The guarantee applies to an app-process crash. Power loss, operating-system or hardware failure, and unhealthy or unusually slow storage are outside it. A persistent autosave warning means Markover is retrying or waiting and the normal bound is suspended until storage recovers.

See Privacy, storage, and recovery for the advanced autosave setting, quit choices after a save problem, and backup guidance.

@@ -157,7 +157,7 @@

Keyboard controls

- + diff --git a/docs/user/index.html b/docs/user/index.html index ce581a07..16bd01a9 100644 --- a/docs/user/index.html +++ b/docs/user/index.html @@ -23,13 +23,13 @@ ?.setAttribute('content', appearance === 'dark' ? '#242221' : '#e8e2d8') })() - - Markover — Early macOS preview + + Markover — Structured review for Markdown - - + + @@ -37,8 +37,8 @@ - - + + @@ -136,10 +136,13 @@

See the complete handoff.

Read the transcript -

Markover starts with a sanitized participant guide, then opens the launch-readiness review from the Needs me inbox. The reviewer sees agent-written Markdown as a document tree with precise feedback and two labeled images attached to one heading. On the opening paragraph, Markover displays an exact word-level source proposal without changing the source document. The reviewer switches to Projects and All annotations to scan the complete review. Finally, the fixture-only CLI returns structured JSON containing status, block feedback, attachment labels, and the source proposal. The demo ends on the Markover lockup and repository address.

+

The 44-second silent demo uses burned-in captions and only invented fixture data.

+

Markover starts with a sanitized participant guide, then opens the launch-readiness review from the Needs me inbox. The Ember Light theme's three-pane layout establishes the review. The reviewer sees agent-written Markdown as a document tree with feedback and two labeled images attached to one heading.

+

On the opening paragraph, Markover displays an exact word-level source proposal without changing the source document. The reviewer switches to Projects and All annotations to scan the complete review.

+

Finally, the CLI (running against demo fixture data) returns structured JSON containing the review status, block feedback, attachment IDs and labels, and source proposal. The demo ends on the Markover lockup, “Structured review for Markdown,” and the repository address.

Open the standalone transcript

-

Free and MIT-licensed early preview. No account required; ordinary review data stays in your macOS account. Requires Apple Silicon macOS 14+ and Node.js 22.13+ for the launcher.

+

Free, MIT-licensed early preview. No account, no telemetry; review data stays on your Mac. Requires Apple Silicon, macOS 14+, and Node.js 22.13+ for the launcher.

@@ -147,12 +150,12 @@

See the complete handoff.

01

Navigate structure

-

Move through YAML frontmatter, headings, lists, paragraphs, code, tables and block quotes as a tree.

+

Move through YAML frontmatter, headings, lists, paragraphs, code, tables, and block quotes as a tree.

02

Annotate precisely

-

Attach feedback and screenshots to the exact Markdown block(s) that need attention.

+

Attach feedback and screenshots to the Markdown blocks that need attention.

03 @@ -163,12 +166,12 @@

Return one handoff

-

Agent-friendly by design

-

A review has a clear owner.

+

The workflow

+

At every step, someone owns the review.

  1. Agent opens a Markdown document for review in Markover.

  2. -
  3. Reviewer navigates, annotates, attaches a screenshot… then tells the agent “check markover”.

  4. +
  5. Reviewer navigates, annotates, attaches a screenshot… then tells the agent “Check Markover”.

  6. Agent retrieves one frozen structured handoff from Markover.

@@ -183,7 +186,7 @@

A review has a clear owner.

Markover showing a multi-project document inbox, a structured launch brief, and an annotation editor with two labeled screenshot attachments. -
Review in context. Switch among projects, navigate representative Markdown blocks, and attach labeled screenshots to precise feedback.
+
Review in context. Switch among projects, navigate the document's blocks, and attach labeled screenshots to your feedback.
diff --git a/docs/user/limitations/index.html b/docs/user/limitations/index.html index 001e7561..dcfb9c71 100644 --- a/docs/user/limitations/index.html +++ b/docs/user/limitations/index.html @@ -188,10 +188,10 @@

The original source remains the reference

Early-preview product boundary

    -
  • Markover supports macOS 14 Sonoma or newer on Apple Silicon Macs. Native Intel releases are deferred to the Broad announcement roadmap.
  • +
  • Markover supports macOS 14 Sonoma or newer on Apple Silicon Macs. Native Intel releases are deferred; see issue #80.
  • The launcher requires Node.js 22.13.0 or newer.
  • Current downloads are hardened and ad-hoc signed, but not Apple-verified or notarized.
  • -
  • Unreleased prototype formats may change directly. Released review schemas are converted automatically with an original backup; unknown future versions remain untouched until a compatible Markover release opens them.
  • +
  • Data formats from unreleased prototype builds may change without migration support. Released review schemas are converted automatically with an original backup; unknown future versions remain untouched until a compatible Markover release opens them.
  • Managed reviews and their unused attachments can be moved to the macOS Trash from Markover. Cache management and a complete reset use the procedures in Privacy, storage, and recovery.
diff --git a/docs/user/privacy/index.html b/docs/user/privacy/index.html index 9e6026ac..0b1ed0e5 100644 --- a/docs/user/privacy/index.html +++ b/docs/user/privacy/index.html @@ -91,7 +91,7 @@

Reference

Privacy, storage, and recovery

-

Markover keeps ordinary review work on your Mac. This page explains the account boundary, stored data, deliberate network actions, backups, reinstall, deletion, and reset without requiring implementation knowledge.

+

Markover keeps ordinary review work on your Mac. This page explains the account boundary, stored data, deliberate network actions, backups, reinstall, deletion, and reset.

Local means your macOS account

@@ -109,9 +109,9 @@

How the local API is protected

Optional remote client

-

Allow the authorized remote Markover client is off by default. When you enable it on canonical Markover, Tailscale Serve can carry review commands from the one tailnet host you authorize into the same Markover app, settings, and review store on this Mac. The gateway binds only to loopback and requires the exact Tailscale application capability plus cryptographic proof of a separate secret protected to your account on each Mac. The secret itself is not sent with requests. Markover does not configure your tailnet policy, drive Tailscale login, expose a Tailscale-IP listener, or enable Funnel.

+

Allow the authorized remote Markover client is off by default. When you enable it, Tailscale Serve can carry review commands from the one tailnet host you authorize into the same Markover app, settings, and review store on this Mac. The gateway binds only to loopback and requires the exact Tailscale application capability plus cryptographic proof of a separate secret protected to your account on each Mac. The secret itself is not sent with requests. Markover does not configure your tailnet policy, drive Tailscale login, expose a Tailscale-IP listener, or enable Funnel.

The remote path can receive the complete requested Markdown source, its source path, checksum, review purpose, and agent-supplied Git, pull-request, and thread provenance. Lifecycle commands can return review source, feedback, source-edit proposals, attachment metadata, and provenance to that authorized host. A remote handoff replaces each checked screenshot's canonical file path with a short-lived private HTTPS URL scoped to that attachment and running gateway. Downloading it requires the Tailscale authorization; Markover verifies the managed file's location, length, type, and checksum before returning authenticated bytes. Restarting the gateway invalidates outstanding attachment URLs.

-

A remotely supplied source path is only a locator for the returning agent. Canonical Markover marks its source and project state unavailable and does not read that path or run Git beside it, even if the same absolute path exists on this Mac.

+

A remotely supplied source path is only a locator for the returning agent. Markover marks its source and project state unavailable and does not read that path or run Git beside it, even if the same absolute path exists on this Mac.

Your Tailscale hostname is public certificate metadata. Tailscale HTTPS certificate issuance records the canonical machine name in public Certificate Transparency logs. Choose a machine name that contains no sensitive information.

Disabling the setting closes Markover's private loopback gateway after its current bounded request finishes. The same Tailscale Serve configuration cannot reach Markover again until you re-enable it. Another ordinary macOS account can connect to loopback but cannot authenticate without the protected gateway credential; processes already running as you, administrators, and root remain inside the account trust boundary.

@@ -159,13 +159,13 @@

Advanced: change the autosave window

When the internet may be used

-

Ordinary review handling has no telemetry, analytics, cloud synchronization, or automatic upload of review content. The only review-ingress exception is the remote client you explicitly enable and authorize through Tailscale; it sends the review you requested to this Mac's canonical store.

+

Ordinary review handling has no telemetry, analytics, cloud synchronization, or automatic upload of review content. The only review-ingress exception is the remote client you explicitly enable and authorize through Tailscale; it sends the review you requested to this Mac's review store.

  • Installing or updating through the launcher can download packages and release files from npm or GitHub.
  • -
  • The configured canonical development app automatically checks one fixed Markover GitHub Pages JSON file for newer merged pull requests. That request sends no review content. Markover validates and keeps the last valid pull-request changelist in owner-only application data so the update tooltip can open promptly; installing an update still requires your click.
  • +
  • Markover automatically checks one fixed Markover GitHub Pages JSON file for newer merged pull requests. That request sends no review content. Markover validates and keeps the last valid pull-request changelist in owner-only application data so the update tooltip can open promptly; installing an update still requires your click.
  • Inline Markdown image syntax is inert by default. Only an embedded data: image can open through its explicit preview control. Relative paths, local file paths, and HTTP(S) URLs remain unavailable; choosing their controls makes no network request.
-

Launcher installation and update installation are user-triggered connections. The bounded canonical changelist check is automatic, so Markover does not claim that it never connects to the internet.

+

Launcher installation and update installation are user-triggered connections. The bounded changelist check is automatic, so Markover does not claim that it never connects to the internet.

diff --git a/docs/user/remote-access/index.html b/docs/user/remote-access/index.html index 7635e015..35e28aa0 100644 --- a/docs/user/remote-access/index.html +++ b/docs/user/remote-access/index.html @@ -103,7 +103,7 @@

Remote access with Tailscale Serve

Before you configure Serve

    -
  1. Install Tailscale 1.92 or newer on the Mac running canonical Markover and on the remote client device. Sign both into the same tailnet. Run tailscale version on each device to check.
  2. +
  3. Install Tailscale 1.92 or newer on the Mac running Markover and on the remote client device. Sign both into the same tailnet. Run tailscale version on each device to check.
  4. Choose one unused tailnet HTTPS port for Markover. A dedicated port avoids replacing an existing root handler or another application's route.
  5. Use Markover's fixed product endpoint, http://127.0.0.1:39831. Keep that target on loopback; do not bind Markover directly to a LAN or Tailscale address.
  6. Ask your tailnet administrator to authorize only the intended remote device to reach that HTTPS port and forward lastobelus.com/cap/markover-remote-client. See Tailscale's Serve identity headers and grants reference.
  7. @@ -139,7 +139,7 @@

    Verify the result

  8. Every pre-existing Serve handler is unchanged.
  9. Funnel has no grant for the Markover port.
  10. -

    Enable Allow the authorized remote Markover client in canonical Markover only when you want the gateway to accept requests. Disabling Markover closes its loopback gateway but deliberately leaves the Tailscale handler in place.

    +

    Enable Allow the authorized remote Markover client in Markover only when you want the gateway to accept requests. Disabling Markover closes its loopback gateway but deliberately leaves the Tailscale handler in place.

From 60603d03a71a3d09bb73f59a142f27e74db54e29 Mon Sep 17 00:00:00 2001 From: Michael Johnston Date: Sun, 30 Aug 2026 14:34:53 -0700 Subject: [PATCH 2/5] align public copy assertions --- doc/launch/issue-16/demo-transcript.md | 16 +++++++++++----- test/docs-site.test.ts | 4 ++-- test/launch-assets.test.ts | 26 ++++++++++++++++++++++++-- 3 files changed, 37 insertions(+), 9 deletions(-) diff --git a/doc/launch/issue-16/demo-transcript.md b/doc/launch/issue-16/demo-transcript.md index ff12aa16..559b3cec 100644 --- a/doc/launch/issue-16/demo-transcript.md +++ b/doc/launch/issue-16/demo-transcript.md @@ -1,9 +1,12 @@ # Markover focused-preview demo transcript -The 44-second silent demo uses burned-in captions and only invented fixture data. - This file is the canonical transcript. The inline transcript on the Pages demo -section must match it verbatim; update both together when the demo changes. +section must match the text between the markers below; update both together +when the demo changes. + + + +The 44-second silent demo uses burned-in captions and only invented fixture data. Markover starts with a sanitized participant guide, then opens the launch-readiness review from the **Needs me** inbox. The Ember Light theme's @@ -18,8 +21,11 @@ without changing the source document. The reviewer switches to **Projects** and Finally, the CLI (running against demo fixture data) returns structured JSON containing the review status, block feedback, attachment IDs and labels, and source proposal. The demo ends on the Markover lockup, “Structured review for -Markdown,” the free, MIT-licensed macOS early-preview boundary, and the -repository address. +Markdown,” and the repository address. + + + +The end card also states the free, MIT-licensed macOS early-preview boundary. No canonical review, private path, real repository, real pull request, real thread identity, credential, notification, unrelated application chrome, or diff --git a/test/docs-site.test.ts b/test/docs-site.test.ts index 71bc4ac3..0d3a7cc1 100644 --- a/test/docs-site.test.ts +++ b/test/docs-site.test.ts @@ -113,7 +113,7 @@ test('README and Pages share one strongest product image', () => { assert.deepEqual(readmeScreenshots, ['markover-review-editor@2x.png']) assert.match( readme, - /alt="Markover in Ember Light showing the review inbox, a launch brief in the center document tree, and precise feedback with two labeled attachments\."/ + /alt="[^"]*Ember Light[^"]*review inbox[^"]*launch brief[^"]*two labeled attachments\."/ ) assert.match( html, @@ -582,7 +582,7 @@ test('the public Tailscale example is additive and keeps local routing private', test('the early-preview contract is concise and consistent on user entry paths', () => { for (const source of [html, guide, readme]) { - assert.match(source, /Early macOS preview/) + assert.match(source, /early (?:macOS )?preview/i) } for (const source of [guide, readme, limitations]) { assert.match(source, /macOS 14 Sonoma/) diff --git a/test/launch-assets.test.ts b/test/launch-assets.test.ts index eb7ac1e1..ca0a18f6 100644 --- a/test/launch-assets.test.ts +++ b/test/launch-assets.test.ts @@ -133,7 +133,27 @@ test('Pages offers an accessible current-UI demo without surprise playback', () const transcript = document.querySelector('#demo-transcript') const disclosure = document.querySelector('.demo-disclosure') assert.ok(transcript) - assert.ok(transcript.textContent.includes('fixture-only CLI')) + const canonicalTranscript = fs.readFileSync( + path.join(issueDirectory, 'demo-transcript.md'), + 'utf8' + ) + const canonicalPagesText = canonicalTranscript.match( + /\s*([\s\S]*?)\s*/ + )?.[1] + assert.ok(canonicalPagesText) + const normalizeTranscript = (value: string): string => value + .replace(/\*\*/g, '') + .replace(/\s+/g, ' ') + .trim() + const inlinePagesText = [...transcript.querySelectorAll(':scope > p')] + .filter((paragraph) => !paragraph.querySelector('a')) + .map((paragraph) => paragraph.textContent) + .join(' ') + assert.equal( + normalizeTranscript(inlinePagesText), + normalizeTranscript(canonicalPagesText) + ) + assert.match(transcript.textContent, /demo fixture data/) assert.ok(disclosure) assert.equal(transcript.nextElementSibling, disclosure) }) @@ -203,7 +223,9 @@ test('README uses one linked product image and states the preview boundary', () const readme = fs.readFileSync(path.join(root, 'README.md'), 'utf8') assert.equal((readme.match(/markover-review-editor@2x\.png/g) ?? []).length, 1) assert.match(readme, /href="https:\/\/lastobelus\.github\.io\/markover\/#demo"/) - assert.match(readme, /free and\s+MIT-licensed, requires no account/) + assert.match(readme, /early preview/i) + assert.match(readme, /free and MIT-licensed/i) + assert.match(readme, /requires no\s+account/i) assert.match(readme, /public npm package named `markover` is unrelated/) assert.match(readme, /--package=https:\/\/github\.com\/lastobelus\/markover\/releases\/latest\/download\/markover-cli\.tgz/) }) From f8c1bb627a58ec2ae3b97a5f5f2addc12367d984 Mon Sep 17 00:00:00 2001 From: Michael Johnston Date: Sun, 30 Aug 2026 17:20:42 -0700 Subject: [PATCH 3/5] restore canonical and pane terminology --- doc/launch/issue-16/demo-storyboard.md | 2 +- doc/launch/issue-16/demo-transcript.md | 8 ++++---- docs/user/index.html | 2 +- docs/user/privacy/index.html | 10 +++++----- docs/user/remote-access/index.html | 4 ++-- test/docs-site.test.ts | 4 ++++ test/launch-assets.test.ts | 2 ++ 7 files changed, 19 insertions(+), 13 deletions(-) diff --git a/doc/launch/issue-16/demo-storyboard.md b/doc/launch/issue-16/demo-storyboard.md index 4cc8f99c..ccc042a0 100644 --- a/doc/launch/issue-16/demo-storyboard.md +++ b/doc/launch/issue-16/demo-storyboard.md @@ -17,7 +17,7 @@ ### 0:00–0:07 — Open one review from the inbox Show the prepared Inbox with **Needs me** active, then open **Launch readiness -brief** from its review row. Let the three-pane Ember Light layout establish +brief** from its review row. Let the Ember Light Pane layout establish the selected document block and feedback pane. Captions: **Open one review from the inbox.** then **Review agent-written diff --git a/doc/launch/issue-16/demo-transcript.md b/doc/launch/issue-16/demo-transcript.md index 559b3cec..2102780a 100644 --- a/doc/launch/issue-16/demo-transcript.md +++ b/doc/launch/issue-16/demo-transcript.md @@ -9,10 +9,10 @@ when the demo changes. The 44-second silent demo uses burned-in captions and only invented fixture data. Markover starts with a sanitized participant guide, then opens the -launch-readiness review from the **Needs me** inbox. The Ember Light theme's -three-pane layout establishes the review. The reviewer sees agent-written -Markdown as a document tree with feedback and two labeled images attached to -one heading. +launch-readiness review from the **Needs me** inbox. The current Ember Light +App header and Pane layout with Left, Center, and Right panes establish the +review. The reviewer sees agent-written Markdown as a document tree with +feedback and two labeled images attached to one heading. On the opening paragraph, Markover displays an exact word-level source proposal without changing the source document. The reviewer switches to **Projects** and diff --git a/docs/user/index.html b/docs/user/index.html index 16bd01a9..44967454 100644 --- a/docs/user/index.html +++ b/docs/user/index.html @@ -137,7 +137,7 @@

See the complete handoff.

Read the transcript

The 44-second silent demo uses burned-in captions and only invented fixture data.

-

Markover starts with a sanitized participant guide, then opens the launch-readiness review from the Needs me inbox. The Ember Light theme's three-pane layout establishes the review. The reviewer sees agent-written Markdown as a document tree with feedback and two labeled images attached to one heading.

+

Markover starts with a sanitized participant guide, then opens the launch-readiness review from the Needs me inbox. The current Ember Light App header and Pane layout with Left, Center, and Right panes establish the review. The reviewer sees agent-written Markdown as a document tree with feedback and two labeled images attached to one heading.

On the opening paragraph, Markover displays an exact word-level source proposal without changing the source document. The reviewer switches to Projects and All annotations to scan the complete review.

Finally, the CLI (running against demo fixture data) returns structured JSON containing the review status, block feedback, attachment IDs and labels, and source proposal. The demo ends on the Markover lockup, “Structured review for Markdown,” and the repository address.

Open the standalone transcript

diff --git a/docs/user/privacy/index.html b/docs/user/privacy/index.html index 0b1ed0e5..3a912c68 100644 --- a/docs/user/privacy/index.html +++ b/docs/user/privacy/index.html @@ -109,9 +109,9 @@

How the local API is protected

Optional remote client

-

Allow the authorized remote Markover client is off by default. When you enable it, Tailscale Serve can carry review commands from the one tailnet host you authorize into the same Markover app, settings, and review store on this Mac. The gateway binds only to loopback and requires the exact Tailscale application capability plus cryptographic proof of a separate secret protected to your account on each Mac. The secret itself is not sent with requests. Markover does not configure your tailnet policy, drive Tailscale login, expose a Tailscale-IP listener, or enable Funnel.

+

Allow the authorized remote Markover client is off by default. When you enable it on canonical Markover, Tailscale Serve can carry review commands from the one tailnet host you authorize into the same Markover app, settings, and review store on this Mac. The gateway binds only to loopback and requires the exact Tailscale application capability plus cryptographic proof of a separate secret protected to your account on each Mac. The secret itself is not sent with requests. Markover does not configure your tailnet policy, drive Tailscale login, expose a Tailscale-IP listener, or enable Funnel.

The remote path can receive the complete requested Markdown source, its source path, checksum, review purpose, and agent-supplied Git, pull-request, and thread provenance. Lifecycle commands can return review source, feedback, source-edit proposals, attachment metadata, and provenance to that authorized host. A remote handoff replaces each checked screenshot's canonical file path with a short-lived private HTTPS URL scoped to that attachment and running gateway. Downloading it requires the Tailscale authorization; Markover verifies the managed file's location, length, type, and checksum before returning authenticated bytes. Restarting the gateway invalidates outstanding attachment URLs.

-

A remotely supplied source path is only a locator for the returning agent. Markover marks its source and project state unavailable and does not read that path or run Git beside it, even if the same absolute path exists on this Mac.

+

A remotely supplied source path is only a locator for the returning agent. Canonical Markover marks its source and project state unavailable and does not read that path or run Git beside it, even if the same absolute path exists on this Mac.

Your Tailscale hostname is public certificate metadata. Tailscale HTTPS certificate issuance records the canonical machine name in public Certificate Transparency logs. Choose a machine name that contains no sensitive information.

Disabling the setting closes Markover's private loopback gateway after its current bounded request finishes. The same Tailscale Serve configuration cannot reach Markover again until you re-enable it. Another ordinary macOS account can connect to loopback but cannot authenticate without the protected gateway credential; processes already running as you, administrators, and root remain inside the account trust boundary.

@@ -159,13 +159,13 @@

Advanced: change the autosave window

When the internet may be used

-

Ordinary review handling has no telemetry, analytics, cloud synchronization, or automatic upload of review content. The only review-ingress exception is the remote client you explicitly enable and authorize through Tailscale; it sends the review you requested to this Mac's review store.

+

Ordinary review handling has no telemetry, analytics, cloud synchronization, or automatic upload of review content. The only review-ingress exception is the remote client you explicitly enable and authorize through Tailscale; it sends the review you requested to this Mac's canonical store.

  • Installing or updating through the launcher can download packages and release files from npm or GitHub.
  • -
  • Markover automatically checks one fixed Markover GitHub Pages JSON file for newer merged pull requests. That request sends no review content. Markover validates and keeps the last valid pull-request changelist in owner-only application data so the update tooltip can open promptly; installing an update still requires your click.
  • +
  • The configured canonical development app automatically checks one fixed Markover GitHub Pages JSON file for newer merged pull requests. That request sends no review content. Markover validates and keeps the last valid pull-request changelist in owner-only application data so the update tooltip can open promptly; installing an update still requires your click.
  • Inline Markdown image syntax is inert by default. Only an embedded data: image can open through its explicit preview control. Relative paths, local file paths, and HTTP(S) URLs remain unavailable; choosing their controls makes no network request.
-

Launcher installation and update installation are user-triggered connections. The bounded changelist check is automatic, so Markover does not claim that it never connects to the internet.

+

Launcher installation and update installation are user-triggered connections. The bounded canonical changelist check is automatic, so Markover does not claim that it never connects to the internet.

diff --git a/docs/user/remote-access/index.html b/docs/user/remote-access/index.html index 35e28aa0..7635e015 100644 --- a/docs/user/remote-access/index.html +++ b/docs/user/remote-access/index.html @@ -103,7 +103,7 @@

Remote access with Tailscale Serve

Before you configure Serve

    -
  1. Install Tailscale 1.92 or newer on the Mac running Markover and on the remote client device. Sign both into the same tailnet. Run tailscale version on each device to check.
  2. +
  3. Install Tailscale 1.92 or newer on the Mac running canonical Markover and on the remote client device. Sign both into the same tailnet. Run tailscale version on each device to check.
  4. Choose one unused tailnet HTTPS port for Markover. A dedicated port avoids replacing an existing root handler or another application's route.
  5. Use Markover's fixed product endpoint, http://127.0.0.1:39831. Keep that target on loopback; do not bind Markover directly to a LAN or Tailscale address.
  6. Ask your tailnet administrator to authorize only the intended remote device to reach that HTTPS port and forward lastobelus.com/cap/markover-remote-client. See Tailscale's Serve identity headers and grants reference.
  7. @@ -139,7 +139,7 @@

    Verify the result

  8. Every pre-existing Serve handler is unchanged.
  9. Funnel has no grant for the Markover port.
  10. -

    Enable Allow the authorized remote Markover client in Markover only when you want the gateway to accept requests. Disabling Markover closes its loopback gateway but deliberately leaves the Tailscale handler in place.

    +

    Enable Allow the authorized remote Markover client in canonical Markover only when you want the gateway to accept requests. Disabling Markover closes its loopback gateway but deliberately leaves the Tailscale handler in place.

diff --git a/test/docs-site.test.ts b/test/docs-site.test.ts index 0d3a7cc1..84c1f7b3 100644 --- a/test/docs-site.test.ts +++ b/test/docs-site.test.ts @@ -569,6 +569,8 @@ test('the public Tailscale example is additive and keeps local routing private', assert.match(remoteAccess, /tailscale serve status --json/) assert.match(remoteAccess, /tailscale funnel status --json/) assert.match(remoteAccess, /Tailscale 1\.92 or newer/) + assert.match(remoteAccess, /Mac running canonical Markover/) + assert.match(remoteAccess, /in canonical Markover only/) assert.match(remoteAccess, /tailscale version/) assert.match(remoteAccess, /--accept-app-caps=lastobelus\.com\/cap\/markover-remote-client/) assert.match(remoteAccess, /DEDICATED_HTTPS_PORT='replace-with-an-unused-port'/) @@ -578,6 +580,8 @@ test('the public Tailscale example is additive and keeps local routing private', assert.match(remoteAccess, /Funnel has no grant for the Markover port/) assert.doesNotMatch(remoteAccess, /8443/) assert.doesNotMatch(remoteAccess, /https:\/\/[^<\s]*\.ts\.net/) + assert.match(privacy, /configured canonical development app automatically checks/) + assert.match(privacy, /bounded canonical changelist check is automatic/) }) test('the early-preview contract is concise and consistent on user entry paths', () => { diff --git a/test/launch-assets.test.ts b/test/launch-assets.test.ts index ca0a18f6..f96fce7c 100644 --- a/test/launch-assets.test.ts +++ b/test/launch-assets.test.ts @@ -141,6 +141,8 @@ test('Pages offers an accessible current-UI demo without surprise playback', () /\s*([\s\S]*?)\s*/ )?.[1] assert.ok(canonicalPagesText) + assert.match(canonicalPagesText, /App header and Pane layout with Left, Center, and Right panes/) + assert.doesNotMatch(canonicalPagesText, /three-pane/i) const normalizeTranscript = (value: string): string => value .replace(/\*\*/g, '') .replace(/\s+/g, ' ') From 4776b9c9d632c4855021f6c660feb18e69f88ddc Mon Sep 17 00:00:00 2001 From: Michael Johnston Date: Sun, 30 Aug 2026 17:27:45 -0700 Subject: [PATCH 4/5] keep agent and privacy copy contract-accurate --- doc/launch/issue-16/focused-preview-copy.md | 4 ++-- docs/user/agents/index.html | 2 +- docs/user/index.html | 2 +- test/docs-site.test.ts | 2 ++ test/launch-assets.test.ts | 2 ++ 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/launch/issue-16/focused-preview-copy.md b/doc/launch/issue-16/focused-preview-copy.md index 74325f08..4206309c 100644 --- a/doc/launch/issue-16/focused-preview-copy.md +++ b/doc/launch/issue-16/focused-preview-copy.md @@ -9,8 +9,8 @@ different useful question. I’m preparing an early macOS preview of Markover, a free, MIT-licensed app for reviewing agent-written Markdown block by block. It needs no account, and -review data stays on your Mac. I’m looking for Codex and coding-agent users -willing to test one real document review and report where the +ordinary review data stays in your macOS account. I’m looking for Codex and +coding-agent users willing to test one real document review and report where the open → annotate → structured handoff loop breaks down. Apple Silicon macOS 14+ only for this preview. [Watch the 44-second workflow](https://lastobelus.github.io/markover/#demo). diff --git a/docs/user/agents/index.html b/docs/user/agents/index.html index f43c86be..0285f2b8 100644 --- a/docs/user/agents/index.html +++ b/docs/user/agents/index.html @@ -105,6 +105,7 @@

Review a Markdown document with Markover

Open one review

Give Markover a Markdown path and a short summary of why the document exists and what feedback would help:

+
Pull-request-associated commands. Before an open, get, get-for-review, revise, or done that involves a pull request, run markover help. Its machine-readable pullRequestStatus contract defines the live GitHub lookup, status mapping, flags, and lookup-failure behavior.
npx --yes \
   --package=https://github.com/lastobelus/markover/releases/latest/download/markover-cli.tgz \
   markover open ./DOCUMENT.md \
@@ -123,7 +124,6 @@ 

Open one review

Give the reviewer all three opening aids: a best-effort [Open in Markover](<reviewUrl>) link, the raw review ID, and this Terminal fallback alone on its own line:

open 'markover://review/mko_8f3a2c'

Custom-scheme links work through macOS, but some chat apps, including T3 Code and the Codex app, do not currently open them from Markdown. The standalone command is the reliable handoff.

-
Pull-request-associated commands. Before an open, get, get-for-review, revise, or done that involves a pull request, run markover help. Its machine-readable pullRequestStatus contract defines the live GitHub lookup, status mapping, flags, and lookup-failure behavior.
diff --git a/docs/user/index.html b/docs/user/index.html index 44967454..1fcc796d 100644 --- a/docs/user/index.html +++ b/docs/user/index.html @@ -142,7 +142,7 @@

See the complete handoff.

Finally, the CLI (running against demo fixture data) returns structured JSON containing the review status, block feedback, attachment IDs and labels, and source proposal. The demo ends on the Markover lockup, “Structured review for Markdown,” and the repository address.

Open the standalone transcript

-

Free, MIT-licensed early preview. No account, no telemetry; review data stays on your Mac. Requires Apple Silicon, macOS 14+, and Node.js 22.13+ for the launcher.

+

Free, MIT-licensed early preview. No account, no telemetry; ordinary review data stays in your macOS account. Requires Apple Silicon, macOS 14+, and Node.js 22.13+ for the launcher.

diff --git a/test/docs-site.test.ts b/test/docs-site.test.ts index 84c1f7b3..e639c71b 100644 --- a/test/docs-site.test.ts +++ b/test/docs-site.test.ts @@ -558,6 +558,7 @@ test('user and developer documentation have explicit audience roots', () => { assert.match(agents, /id="revise"[\s\S]*markover revise/) assert.match(agents, /id="done"[\s\S]*markover done/) assert.match(agents, /pullRequestStatus/) + assert.ok(agents.indexOf('pullRequestStatus') < agents.indexOf('markover open ./DOCUMENT.md')) assert.match(agents, /review\.agentGuidance\.fixedContract/) assert.match(agents, /thread-host-kind/) assert.match(agents, /Validate the handoff before reading it/) @@ -588,6 +589,7 @@ test('the early-preview contract is concise and consistent on user entry paths', for (const source of [html, guide, readme]) { assert.match(source, /early (?:macOS )?preview/i) } + assert.match(html, /ordinary review data stays in your macOS account/) for (const source of [guide, readme, limitations]) { assert.match(source, /macOS 14 Sonoma/) assert.match(source, /Apple Silicon Macs/) diff --git a/test/launch-assets.test.ts b/test/launch-assets.test.ts index f96fce7c..5ae1ea20 100644 --- a/test/launch-assets.test.ts +++ b/test/launch-assets.test.ts @@ -223,11 +223,13 @@ test('the launch manifest pins every binary and keeps release claims honest', () test('README uses one linked product image and states the preview boundary', () => { const readme = fs.readFileSync(path.join(root, 'README.md'), 'utf8') + const launchCopy = fs.readFileSync(path.join(issueDirectory, 'focused-preview-copy.md'), 'utf8') assert.equal((readme.match(/markover-review-editor@2x\.png/g) ?? []).length, 1) assert.match(readme, /href="https:\/\/lastobelus\.github\.io\/markover\/#demo"/) assert.match(readme, /early preview/i) assert.match(readme, /free and MIT-licensed/i) assert.match(readme, /requires no\s+account/i) + assert.match(launchCopy, /ordinary review data stays in your macOS account/) assert.match(readme, /public npm package named `markover` is unrelated/) assert.match(readme, /--package=https:\/\/github\.com\/lastobelus\/markover\/releases\/latest\/download\/markover-cli\.tgz/) }) From 8501a65d4ae1c9959634123d084c3989007bd021 Mon Sep 17 00:00:00 2001 From: Michael Johnston Date: Sun, 30 Aug 2026 17:34:47 -0700 Subject: [PATCH 5/5] narrow every local-data promise --- README.md | 2 +- doc/launch/issue-16/focused-preview-copy.md | 10 ++++++---- test/launch-assets.test.ts | 6 ++++++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ab402e11..19e23d64 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ into chat, feedback stays attached to the blocks it concerns, and the agent retrieves the whole review in a single structured handoff. Markover is in **early preview**. It is free and MIT-licensed, requires no -account, and keeps review data on your Mac. +account, and keeps ordinary review data in your macOS account.

Markover in Ember Light showing the review inbox, a launch brief in the center document tree, and an annotation with two labeled attachments. diff --git a/doc/launch/issue-16/focused-preview-copy.md b/doc/launch/issue-16/focused-preview-copy.md index 4206309c..d91ee62d 100644 --- a/doc/launch/issue-16/focused-preview-copy.md +++ b/doc/launch/issue-16/focused-preview-copy.md @@ -19,8 +19,9 @@ workflow](https://lastobelus.github.io/markover/#demo). Could you try one document you already ask an agent to write, then review it in Markover instead of flattening feedback into chat? The early macOS preview -is free, MIT licensed, requires no account, and keeps review data on your Mac. I most need the -exact moment the workflow becomes slower or less clear than your current +is free, MIT licensed, requires no account, and keeps ordinary review data in +your macOS account. I most need the exact moment the workflow becomes slower or +less clear than your current process, plus any feedback the agent misinterprets after retrieval. Apple Silicon macOS 14+ only. [Setup and limitations](https://lastobelus.github.io/markover/guide/). @@ -28,8 +29,9 @@ Silicon macOS 14+ only. [Setup and limitations](https://lastobelus.github.io/mar Markover is a macOS app for reviewing agent-produced Markdown and returning structured, block-level feedback to the agent thread. The early preview is -free and MIT licensed, requires no account, keeps review data on your Mac, and -currently supports Apple Silicon macOS 14+. Start with the [current UI and +free and MIT licensed, requires no account, keeps ordinary review data in your +macOS account, and currently supports Apple Silicon macOS 14+. Start with the +[current UI and 44-second demo](https://lastobelus.github.io/markover/#demo), then report concrete workflow failures in [Discussions](https://github.com/lastobelus/markover/discussions). diff --git a/test/launch-assets.test.ts b/test/launch-assets.test.ts index 5ae1ea20..0e7ad6ba 100644 --- a/test/launch-assets.test.ts +++ b/test/launch-assets.test.ts @@ -230,6 +230,12 @@ test('README uses one linked product image and states the preview boundary', () assert.match(readme, /free and MIT-licensed/i) assert.match(readme, /requires no\s+account/i) assert.match(launchCopy, /ordinary review data stays in your macOS account/) + assert.match(readme, /keeps ordinary review data in your macOS account/) + assert.equal((launchCopy.match(/ordinary review data/g) ?? []).length, 3) + assert.doesNotMatch( + `${readme}\n${launchCopy}`, + /(?:keeps\s+review data|(?

KeyAction
Up / DownMove between sibling blocks; climb outward at a boundary
Up / DownMove between sibling blocks; at the first or last sibling, continue at the parent's level
LeftSelect the parent block
RightSelect the first child, then the next available sibling
Tab / Shift-TabMove among the left, center, and right panes