---
id: ATS-PFM-LLM-019
scope: CAP-PFM-LLM-019
product_area: platform
module: llm
revision: 2
status: proposed
source_sha:
  services-platform: ad3f6a6582843008ed0f5a17b131878d15829af1
  react-console: baf6dae382d6f41dce976c7f848667ccc37e076f
scenarios:
  - id: ATS-PFM-LLM-019-01
    title: Prototype Jazz AI has no feature gating
    level: browser
    proves:
      - BR-CAP-PFM-LLM-019-01
    preconditions: A signed-in user lacks AI-specific keys and the organization AI switch is off.
    steps: Open the teammate page and header panel.
    expected: The prototype still opens; product gating remains an unresolved choice.
    negative: false
    data_needs: Fixtures representing a signed-in user lacks AI-specific keys and the organization AI switch is off.
    bound_to: []
    provenance: proposed
    source: 'react-console:components/console/nav-config.ts:unlistedNav'
    category: permission
    test_sources: []
  - id: ATS-PFM-LLM-019-02
    title: General chat bypasses Platform accounting
    level: api
    proves:
      - BR-CAP-PFM-LLM-019-02
    preconditions: An organization has little allowance remaining.
    steps: Ask Jazz AI a general question.
    expected: The console produces a reply without a Platform request or credit hold.
    negative: false
    data_needs: Fixtures representing an organization has little allowance remaining.
    bound_to: []
    provenance: proposed
    source: 'react-console:app/api/agent/conversations/[id]/messages/route.ts:MODEL'
    category: rule
    test_sources: []
  - id: ATS-PFM-LLM-019-03
    title: Conversation input schemas bound lengths
    level: api
    proves:
      - BR-CAP-PFM-LLM-019-05
    preconditions: Agent input schemas accept direct questions and project edits.
    steps: Send blank or oversized direct questions and missing or oversized project names.
    expected: The invalid examples receive input refusals.
    negative: true
    data_needs: Fixtures representing agent input schemas accept direct questions and project edits.
    bound_to: []
    provenance: proposed
    source: 'react-console:lib/agent/schemas.ts'
    category: validation
    test_sources: []
  - id: ATS-PFM-LLM-019-04
    title: Prototype conversations share the sample owner
    level: browser
    proves:
      - BR-CAP-PFM-LLM-019-07
      - INV-DOM-PFM-LLM-005-02
    preconditions: Two users in different workspaces reach the same console process.
    steps: Create and list conversations from both sessions.
    expected: The sample-owner history is shared; the product should isolate real users before release.
    negative: true
    data_needs: Fixtures representing two users in different workspaces reach the same console process.
    bound_to: []
    provenance: proposed
    source: 'react-console:lib/agent/store.ts:owned'
    category: boundary
    test_sources: []
  - id: ATS-PFM-LLM-019-05
    title: Project deletion retains its conversations
    level: browser
    proves:
      - BR-CAP-PFM-LLM-019-08
      - INV-DOM-PFM-LLM-005-04
    preconditions: A project holds two conversations.
    steps: Delete the project folder.
    expected: Both exchanges remain and become unfiled.
    negative: false
    data_needs: Fixtures representing a project holds two conversations.
    bound_to: []
    provenance: proposed
    source: 'react-console:lib/agent/store.ts:deleteProject'
    category: transition
    test_sources: []
  - id: ATS-PFM-LLM-019-06
    title: Archive retains a restorable exchange
    level: browser
    proves:
      - BR-CAP-PFM-LLM-019-09
      - INV-DOM-PFM-LLM-005-06
    preconditions: A conversation is currently open.
    steps: Archive it and restore it from the archive list.
    expected: 'It leaves active lists, another conversation opens and restoration makes the original available again.'
    negative: false
    data_needs: Fixtures representing a conversation is currently open.
    bound_to: []
    provenance: proposed
    source: 'react-console:components/agent/conversation-browser.tsx:onArchive'
    category: transition
    test_sources: []
  - id: ATS-PFM-LLM-019-07
    title: Confirmed deletion removes the exchange
    level: browser
    proves:
      - BR-CAP-PFM-LLM-019-10
    preconditions: A conversation exists in the browser.
    steps: Choose deletion and confirm the dialog.
    expected: The confirmation precedes removal and the conversation no longer appears in active or archived lists.
    negative: true
    data_needs: Fixtures representing a conversation exists in the browser.
    bound_to: []
    provenance: proposed
    source: 'react-console:components/agent/conversation-browser.tsx'
    category: transition
    test_sources: []
  - id: ATS-PFM-LLM-019-08
    title: Scoped history survives navigation and undo
    category: interaction
    level: browser
    proves:
      - BR-CAP-PFM-LLM-019-09
      - BR-CAP-PFM-LLM-020-03
    exercises:
      - CAP-PFM-LLM-019
      - CAP-PFM-LLM-020
    preconditions: A staff person refines an unsaved query with an existing scoped conversation.
    steps: 'Apply a supported edit, undo it, archive its conversation, leave and reopen assistance.'
    expected: >-
      Undo restores the query; reopening restores the same conversation and preserves the exchange without
      saving the query.
    negative: false
    data_needs: 'An isolated workspace with the records, clock instants and caller authority stated in the preconditions.'
    bound_to: []
    provenance: proposed
    source:
      - 'react-console:components/agent/conversation-browser.tsx:onArchive'
      - 'react-console:components/console/agent-chat.tsx:undo'
evidence:
  - >-
    react-console at baf6dae382d6f41dce976c7f848667ccc37e076f: bound or cited
    app/api/agent/conversations/[id]/messages/route.ts:MODEL; components/agent/conversation-browser.tsx
    (delete dialog); components/agent/conversation-browser.tsx:onArchive;
    components/console/nav-config.ts:unlistedNav (Jazz AI); lib/agent/schemas.ts;
    lib/agent/store.ts:deleteProject; lib/agent/store.ts:owned.
coverage:
  rule: 'gap: FND-PFM-LLM-078'
  transition: 'gap: FND-PFM-LLM-078'
  validation: covered
  permission: covered
  edge: 'gap: FND-PFM-LLM-078'
  failure: 'gap: FND-PFM-LLM-078'
  boundary: covered
  concurrency: 'gap: FND-PFM-LLM-078'
  invariant: 'gap: FND-PFM-LLM-078'
  interaction: covered
coverage_notes:
  transition: >-
    Existing transition scenarios are retained; the model transition register below records the remaining
    exhaustive mapping obligation.
  interaction: >-
    The related interaction register cites a concrete experiment for every dependency and related capability,
    including cross-capability workflow seams.
  invariant: >-
    The domain-invariant register maps each relevant invariant to a scenario or to the capability coverage
    finding; an example does not establish every invariant.
  rule: >-
    All must-prove rules have scenario references, but the coverage finding retains untested clauses and
    combined outcomes; scenario presence alone is not exhaustive rule proof.
related_interactions:
  - with: CAP-PFM-LLM-001
    scenarios:
      - ATS-PFM-LLM-001-19
    source: 'services-platform:modules/llm/services/catalog/catalog-authority.ts:resolveLlmOperation'
  - with: CAP-PFM-LLM-020
    scenarios:
      - ATS-PFM-LLM-019-08
    source: 'react-console:lib/agent/store.ts:createConversation'
state_models:
  - STATE-PFM-LLM-008
coverage_obligations:
  must_prove:
    - rule: BR-CAP-PFM-LLM-019-01
      scenarios:
        - ATS-PFM-LLM-019-01
      source: 'react-console:components/console/nav-config.ts:unlistedNav'
      coverage: partial
      gap: FND-PFM-LLM-078
    - rule: BR-CAP-PFM-LLM-019-02
      scenarios:
        - ATS-PFM-LLM-019-02
      source: 'react-console:app/api/agent/conversations/[id]/messages/route.ts:MODEL'
      coverage: specified
    - rule: BR-CAP-PFM-LLM-019-05
      scenarios:
        - ATS-PFM-LLM-019-03
      source: 'react-console:lib/agent/schemas.ts'
      coverage: partial
      gap: FND-PFM-LLM-078
    - rule: BR-CAP-PFM-LLM-019-07
      scenarios:
        - ATS-PFM-LLM-019-04
      source: 'react-console:lib/agent/store.ts:owned'
      coverage: partial
      gap: FND-PFM-LLM-078
    - rule: BR-CAP-PFM-LLM-019-08
      scenarios:
        - ATS-PFM-LLM-019-05
      source: 'react-console:lib/agent/store.ts:deleteProject'
      coverage: partial
      gap: FND-PFM-LLM-078
    - rule: BR-CAP-PFM-LLM-019-09
      scenarios:
        - ATS-PFM-LLM-019-06
        - ATS-PFM-LLM-019-08
      source: 'react-console:components/agent/conversation-browser.tsx:onArchive'
      coverage: partial
      gap: FND-PFM-LLM-078
    - rule: BR-CAP-PFM-LLM-019-10
      scenarios:
        - ATS-PFM-LLM-019-07
      source: 'react-console:components/agent/conversation-browser.tsx'
      coverage: partial
      gap: FND-PFM-LLM-078
  state_transitions:
    - model: STATE-PFM-LLM-008
      transition: 1
      from: absent
      to: new
      trigger: A person starts a general chat.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/store.ts:createConversation'
    - model: STATE-PFM-LLM-008
      transition: 2
      from: absent
      to: active
      trigger: A query or directory opens its scoped history.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:components/queries/query-workspace.tsx:openRefine'
    - model: STATE-PFM-LLM-008
      transition: 3
      from: new
      to: active
      trigger: The first exchange is appended.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/store.ts:appendMessages'
    - model: STATE-PFM-LLM-008
      transition: 4
      from: active
      to: active
      trigger: Messages or conversation metadata change.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/store.ts:updateConversation'
    - model: STATE-PFM-LLM-008
      transition: 5
      from: active
      to: archived
      trigger: A person archives an active conversation.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:components/agent/conversation-browser.tsx:onArchive'
    - model: STATE-PFM-LLM-008
      transition: 6
      from: archived
      to: active
      trigger: A person restores history or scoped creation finds it archived.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/store.ts:createConversation'
    - model: STATE-PFM-LLM-008
      transition: 7
      from: active
      to: absent
      trigger: A person confirms active-conversation deletion.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/store.ts:deleteConversation'
    - model: STATE-PFM-LLM-008
      transition: 8
      from: archived
      to: absent
      trigger: Archived history is deleted or the server process restarts.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/store.ts:db'
    - model: STATE-PFM-LLM-008
      transition: 9
      from: new
      to: archived
      trigger: A person archives an empty conversation.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/store.ts:updateConversation'
    - model: STATE-PFM-LLM-008
      transition: 10
      from: new
      to: absent
      trigger: A person deletes an empty conversation.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/store.ts:deleteConversation'
    - model: STATE-PFM-LLM-008
      transition: 11
      from: new
      to: new
      trigger: A person renames or refiles an empty conversation.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/store.ts:updateConversation'
    - model: STATE-PFM-LLM-008
      transition: 12
      from: archived
      to: archived
      trigger: A caller appends messages to archived history.
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/store.ts:appendMessages'
  domain_invariants:
    - invariant: INV-DOM-PFM-LLM-005-02
      scenarios:
        - ATS-PFM-LLM-019-04
      provenance: documented
      source: 'react-console:lib/agent/store.ts:owned'
    - invariant: INV-DOM-PFM-LLM-005-03
      scenarios: []
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:app/api/agent/conversations/[id]/messages/route.ts:POST'
    - invariant: INV-DOM-PFM-LLM-005-04
      scenarios:
        - ATS-PFM-LLM-019-05
      provenance: documented
      source: 'react-console:lib/agent/store.ts:deleteProject'
    - invariant: INV-DOM-PFM-LLM-005-05
      scenarios: []
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/store.ts:appendMessages'
    - invariant: INV-DOM-PFM-LLM-005-06
      scenarios:
        - ATS-PFM-LLM-019-06
      provenance: documented
      source: 'react-console:lib/agent/store.ts:updateConversation'
    - invariant: INV-DOM-PFM-LLM-005-07
      scenarios: []
      gap: FND-PFM-LLM-078
      provenance: proposed
      source: 'react-console:lib/agent/__tests__/client.test.ts#never routes through the query client'
coverage_limits:
  finding: FND-PFM-LLM-078
  statement: >-
    All empty and archived conversation transitions, restart loss, simultaneous sends and deletion during
    generation lack executable coverage. Prototype entry and sample-owner sharing do not prove customer
    isolation.
  provenance: proposed
  source:
    - 'react-console:components/console/nav-config.ts:unlistedNav'
    - 'react-console:app/api/agent/conversations/[id]/messages/route.ts:MODEL'
    - 'react-console:lib/agent/schemas.ts'
    - 'react-console:lib/agent/store.ts:owned'
    - 'react-console:lib/agent/store.ts:deleteProject'
    - 'react-console:components/agent/conversation-browser.tsx:onArchive'
    - 'react-console:components/agent/conversation-browser.tsx'
    - 'react-console:app/api/agent/conversations/[id]/messages/route.ts:POST'
    - 'react-console:lib/agent/store.ts:appendMessages'
    - 'react-console:lib/agent/__tests__/client.test.ts#never routes through the query client'
  invariants_without_scenarios:
    - INV-DOM-PFM-LLM-005-03
    - INV-DOM-PFM-LLM-005-05
    - INV-DOM-PFM-LLM-005-07
---

# Use Jazz AI conversations and project folders: Capability Test Specification

## Coverage

| Rule | Scenario |
|---|---|
| `BR-CAP-PFM-LLM-019-01` | `ATS-PFM-LLM-019-01` |
| `BR-CAP-PFM-LLM-019-02` | `ATS-PFM-LLM-019-02` |
| `BR-CAP-PFM-LLM-019-05` | `ATS-PFM-LLM-019-03` |
| `BR-CAP-PFM-LLM-019-07` | `ATS-PFM-LLM-019-04` |
| `BR-CAP-PFM-LLM-019-08` | `ATS-PFM-LLM-019-05` |
| `BR-CAP-PFM-LLM-019-09` | `ATS-PFM-LLM-019-06` |
| `BR-CAP-PFM-LLM-019-10` | `ATS-PFM-LLM-019-07` |

## Interactions With Related Capabilities

The interaction register links concrete experiments with run ai requests with consistent attribution and accounting; refine queries and directory filters with jazz ai. Each experiment checks the outcome at the shared boundary; an unbound experiment remains proposed.

All empty and archived conversation transitions, restart loss, simultaneous sends and deletion during generation lack executable coverage. Prototype entry and sample-owner sharing do not prove customer isolation.
