# Conversation imports

Connecting authorizes a destination and exits without uploading history. In **Apps → Connections → Manage → Conversation sync**, connect the source, choose **Choose conversations…**, search by title, folder or session ID, select records, and confirm **Upload N conversations**. Nothing is preselected. Selections survive search and pagination. Activity filters help find conversations; uploading includes their complete eligible turn history. Each confirmed selection replaces the scope of later syncs. Previously uploaded project data is retained.

For an explicit bulk initial upload, use `--upload`. Its history window defaults to the **last week**; choose `--range day|week|all`. A sync with `--selection-file` instead uses exact conversation identities and removes an earlier date cutoff through the registered connection.

**Continual imports default to off.** `--continual` explicitly enables recurring imports. `--daily`, `--weekly`, `--hourly`, and `--cron` select the cadence and require `--continual`; they do not select how much history to import. Continual imports do not enable continual learning or change model training schedules.

```sh
# Connect without uploading.
openpond import --source claude_code

# Search local records and obtain selection keys without uploading.
openpond import conversations <connection-id> --query "invoice" --range all --json

# Upload exactly the keys saved in selection.json.
openpond import sync <connection-id> --selection-file selection.json

# Explicitly import the last week once; no recurring schedule is created.
openpond import --source codex --upload

# Import once and enable daily imports at midnight local time.
openpond import --source codex --upload --continual --daily

# Weekly imports default to Monday at midnight.
openpond import --source codex --upload --continual --weekly

# Import hourly, at minute 00.
openpond import --source codex --upload --continual --hourly


# Cron: hourly on weekdays from 9 a.m. through 5 p.m.
openpond import --source codex --upload --continual --cron "0 9-17 * * mon-fri"

# Choose a weekday and time explicitly.
openpond import --source codex --upload --range week --continual --weekly --on fri --at 01:00

# Set recurrence for an existing connection without starting an import.
openpond import schedule <connection-id> --continual --daily --at 00:00

# Disable recurrence without cancelling an import in progress.
openpond import schedule <connection-id> --off

# Inspect progress, connection IDs, errors and schedules.
openpond import status

# Inspect the exact retained source inventory and revision hashes.
openpond import coverage <connection-id> --json

# Run once now without changing the schedule.
openpond import sync <connection-id>

# Reconcile the registered lower bound through an exact event-time cutoff.
openpond import sync <connection-id> --until 2026-10-10T03:18:22.485Z --json

# Cancel the current job, keeping queued work and its schedule.
openpond import cancel
```

`selection.json` contains `{ "sourceInstanceId": "<installation-id>", "sessionKeys": ["<key>"] }`, copied from `import conversations`. Keys include the native session identity and source path; selections from another installation or missing records are rejected. `--offset` pages through search results. An empty connected selection cannot run or enable recurring imports. Chosen conversation uploads retain coverage evidence without certifying that the entire original source was reconciled.

`--continual` alone defaults to daily at `00:00`. `--weekly` defaults to `--on mon`; supported weekdays are `sun|mon|tue|wed|thu|fri|sat`. Use `--at HH:MM` for the local start time. Choose only one cadence. `--at` applies to daily/weekly schedules, and `--on` applies to weekly schedules. For a custom hourly minute, use cron (for example, `15 * * * *`). Existing schedules stay unchanged when running a one-time import; use `schedule --off` to turn them off.

`--range` selects the initial history cutoff, independently of recurrence. Future jobs reconcile changes against retained source revisions and admission receipts, including changes made during missed days. `Ctrl+C` cancels a foreground job; it does not leave a background importer running.

Each job fixes its upper cutoff at launch unless `import sync --until <UTC timestamp>` supplies an earlier cutoff. Selection uses native request-event timestamps in the half-open window `[since, until)`, not filesystem modification times. The collector retains and publishes a bounded revision inventory with admitted, skipped, failed and unknown-time counts. `import status --json` exposes this as `coverage`; zero queued uploads alone does not mean complete coverage. Preparation independently compares the eligible-boundary hash with the exact hosted Dataset membership at its import cutoff. This attestation establishes source reconciliation, not reconstructed or qualified tasks. Large Codex JSONL files can be inventoried as streams to prove that every native request is outside the window; this retains a full byte hash without uploading the transcript. Selected or undated requests, malformed records and unsupported metadata still require ordinary bounded acquisition and remain explicit failures when unavailable. Recurrence and existing pending-upload identities remain unchanged.

`import coverage <connection-id> --json` returns the retained `manifest` and `summary`. A preparation policy can explicitly account for an unreadable source with `source.excludedSessions`: each entry contains `connectionId`, `sourceKeyHash`, `nativeRevisionHash`, `reason` (`source_read_failed` or `native_session_not_ready`) and an explanation. Copy the exact identities from the retained report. The hosted owner verifies them against its pinned attestation. An exclusion cannot cover known eligible boundaries, unknown event times, pending uploads or an unfinished listing. Changed revisions require a new policy. Preparation reports `coverage.complete` for reconciled eligible membership, `coverage.sourceComplete` for complete original-source coverage, and `coverage.excludedSessions` separately. Excluded transcripts remain unavailable for task reconstruction and learning.

In the desktop app, **Settings → Conversation imports** shows each source and destination, its initial cutoff, last successful sync, next run, progress and errors. Enable **Continual imports**, then choose **Hourly**, **Daily**, **Weekly**, or **Custom cron**, with weekday/time or expression when applicable. Defaults are daily at midnight, or Monday at midnight for weekly. Midnight leaves time before a 02:00 model run; import scheduling does not itself establish a training dependency.

Cron uses five fields: **minute hour day-of-month month day-of-week**. It supports numbers, `*`, comma lists, ranges, steps, month names and weekday names. When both day-of-month and day-of-week are restricted, either can match. Sunday can be `0` or `7`. Seconds, randomization and Quartz extensions (`L`, `#`, `?`) are not supported. The fastest supported cadence is hourly, with a single selected minute. Impossible calendars and invalid expressions are rejected before saving.

Schedules follow the computer's local timezone. The OS launches a bounded job at the selected time; no importer stays running between jobs. The machine is not woken. Runs missed while off or asleep are skipped, without catch-up at login. The next scheduled or manual job resumes retained work. A paused or disconnected source is not automatically resumed by its schedule.

Jobs stop after an hour or a persistent admission failure (at most three attempts for an operation per run). Pending uploads drain before acquiring more history. Errors and unacknowledged work are retained for the next scheduled or manual run. Changing a schedule never starts a job. If a scheduled tick occurs while an import is running, it is skipped rather than queued or overlapped. Cron uses a small, dependency-free calendar check each minute; the full importer is loaded only at matching times.

CLI and desktop share `~/.openpond/conversation-importer` by default, independently of the desktop application's home. Each connection retains the account-store location used to authorize it. For isolated environments, use `--collector-dir <absolute-path>` or `OPENPOND_COLLECTOR_DIR`; the desktop shows its exact directory under **CLI and local state**.

Cron expressions must select a single minute within each hour; sub-hourly imports are not supported. The 128 MiB local queue limit is not a network upload budget. Uploads currently contain full changed source files, so hourly syncing can still transfer substantial data.

## Retain historical starting files

`connected-evidence capture-assets --team <id> --api-base-url <origin> --input-file <request.json>` captures selected Git objects for an already imported Codex case and retains them with its private source owner. It uses the recorded commit, never today's file bytes or an automatic fetch. The request contains `operationId`, an exact `source` case reference (`id`, `snapshotHash`, `boundaryId`, `boundaryRevisionHash`), `sourceFile` (local rollout path), `sourcePath` (the relative alias originally uploaded), `repositoryPath`, `paths`, and the original `acquisition` identity when present. The local source must normalize to the exact retained snapshot. Reuse the request and operation ID after an uncertain response.

The hosted owner checks the complete commit/tree/blob proof and the recorded first-tool status against its authorized snapshot. This initial protocol requires a sequential static `functions.exec` call containing a read-only `pwd`/file inventory followed by `git status --short`, complete successful command results, matching directory identity, and no selected modified path. Unsupported syntax, truncated observations, inherited earlier work, quoted status paths, missing Git objects and later request boundaries remain explicit gaps. Environment files, symlinks and submodules cannot become starting files.

`connected-evidence retain-assets --input-file <request.json>` accepts the same operation/source pins plus already captured `proofs`, bounded to 15 MiB. `connected-evidence starting-assets <receipt-id>` reauthorizes the retained source and rechecks the private bytes before returning metadata. Receipts establish selected starting-file provenance; dependency closure, independent verifiers, reset execution and task qualification remain required before learning. Source credentials cannot perform these owner operations.
