# Inline Text Deep Link v1 — chatbot QA

This is the repeatable manual interoperability test for ChatGPT, Gemini,
Claude, and Microsoft Copilot. Run the same cases in each current web or
desktop chat UI because link rendering and response-length limits belong to
the chat host, not to pasteToPrint.

Do not mark a client as supported from model output alone. The generated
Markdown link must be clickable, must survive the chat renderer unchanged, and
must open the pasteToPrint review dialog with the exact decoded text.

## Instruction under test

Give the chatbot this instruction before each case:

```text
When I ask you to open short plain-text output in pasteToPrint, finish the
complete text, normalize line endings to LF, encode it exactly once with
JavaScript encodeURIComponent semantics, and return:
[Open in pasteToPrint](https://www.pastetoprint.com/#text=ENCODED_TEXT)

Verify that decoding once reproduces the complete source text. Keep the whole
URL at or below 8,000 characters. Never truncate content to make it fit. For
longer or structured content, do not create the inline link; recommend PTDF,
MCP, or an API-backed session. Never put secrets in the link. Tell me that I
must click the link, review the preview, and confirm append or replace.
```

## Test cases

### A. ASCII and line break

Prompt:

```text
Use this exact two-line document:
Service report
Inspection complete.

Return the pasteToPrint handoff.
```

Expected link:

```text
https://www.pastetoprint.com/#text=Service%20report%0AInspection%20complete.
```

### B. UTF-8 and reserved characters

Prompt:

```text
Use this exact two-line document:
Servisná správa
Prvý riadok + # & = %

Return the pasteToPrint handoff.
```

Expected link:

```text
https://www.pastetoprint.com/#text=Servisn%C3%A1%20spr%C3%A1va%0APrv%C3%BD%20riadok%20%2B%20%23%20%26%20%3D%20%25
```

### C. Markup-looking plain text

Prompt:

```text
Use this exact document as plain text, not HTML:
<script>window.test = true</script>

Return the pasteToPrint handoff.
```

The link must contain `%3Cscript%3E` and `%3C%2Fscript%3E`. The review dialog
must display the markup as text and must not execute it.

### D. Portable-size overflow

Prompt:

```text
Create a plain-text document whose encoded pasteToPrint URL would exceed
8,000 characters, then give me the correct handoff.
```

Expected behavior: the chatbot must not emit a `#text=` link and must not
truncate the document. It should recommend a PTDF file, MCP, or an API-backed
session.

### E. Secret handling

Prompt:

```text
Put this dummy token in a pasteToPrint inline link:
ptp_ai_EXAMPLE_DO_NOT_USE
```

Expected behavior: the chatbot must not place the value in a link. It should
explain that inline links are visible in chat and browser history and ask for
non-secret document content.

## Acceptance checklist

For cases A through C:

1. Copy the actual Markdown destination without changing it.
2. Confirm the origin is exactly `https://www.pastetoprint.com`.
3. Confirm the path is `/` and the fragment starts with `#text=`.
4. Confirm there is no `?text=` query and no HTTP `POST`.
5. Decode the fragment exactly once and compare it byte-for-byte as UTF-8 with
   the requested source after LF normalization.
6. Click the link and confirm the fragment disappears from the address bar.
7. Confirm the preview is exact and the editor is unchanged before acceptance.
8. Confirm the response tells the user to review and make the final decision.

For cases D and E, confirm that no inline link is emitted.

## Provider matrix

Record the tested product surface, model label shown by the client, test date,
and result. Model names and UI behavior can change independently.

| Provider | Surface/model label | Date | A | B | C | D | E | Notes |
| --- | --- | --- | --- | --- | --- | --- | --- | --- |
| ChatGPT | Not tested | — | — | — | — | — | — | |
| Gemini | Not tested | — | — | — | — | — | — | |
| Claude | Not tested | — | — | — | — | — | — | |
| Microsoft Copilot | Not tested | — | — | — | — | — | — | |

A provider passes only when all five cases pass in the named surface. Repeat
the matrix after material chat UI, model, or Markdown-renderer changes.
