From fd3b009d9f8d4a815de697ae75ce787ba76e9b13 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Sun, 13 Sep 2026 22:38:07 +0200 Subject: [PATCH] docs(agent): add pico3 view/events, plugins and hardening handoff Canonical pico3 material under packages/agent/docs/pico/v3/: - hardening-handoff.md: V3 hardening handoff with supersession table - view-and-events.md: single view document, ops by path, named events, commit-by-commit mapping, Codex mapping, watchers and late joiners - plugins.md: harness registration surface, durable primitives, extension points with examples, reload contract, Chord facet layer - harness-v3.zip: baseline sketch backup (sha256 1c69c5c5...fbe7) --- .../agent/docs/pico/v3/hardening-handoff.md | 462 ++++++++++++++++ packages/agent/docs/pico/v3/harness-v3.zip | Bin 0 -> 176487 bytes packages/agent/docs/pico/v3/plugins.md | 523 ++++++++++++++++++ .../agent/docs/pico/v3/view-and-events.md | 489 ++++++++++++++++ 4 files changed, 1474 insertions(+) create mode 100644 packages/agent/docs/pico/v3/hardening-handoff.md create mode 100644 packages/agent/docs/pico/v3/harness-v3.zip create mode 100644 packages/agent/docs/pico/v3/plugins.md create mode 100644 packages/agent/docs/pico/v3/view-and-events.md diff --git a/packages/agent/docs/pico/v3/hardening-handoff.md b/packages/agent/docs/pico/v3/hardening-handoff.md new file mode 100644 index 000000000..f0abeff31 --- /dev/null +++ b/packages/agent/docs/pico/v3/hardening-handoff.md @@ -0,0 +1,462 @@ +# Harness V3 hardening handoff + +## Goal + +Harden the implementation in `harness-v3.zip` without reverting its core design. Return a new standalone zip for review. Do not integrate it into the pi repository yet; the accepted implementation will later be incorporated under `packages/agent/src/harness/pico3/`. + +Baseline archive: + +- `~/Downloads/harness-v3.zip` +- SHA-256: `1c69c5c5d923fe1c80200cc5e49ddb3868158e1b6a844efa3e2f03eb24ff5be7` +- Current runtime suite: 67 passing tests +- Current kernel + kinds: approximately 3,448 lines, excluding storage backends + +The current code is a good executable design spike. Preserve its legible fixed-core, document/view, and phase-map architecture. Correctness takes precedence over preserving the exact line count. + +## Companion documents and supersessions + +This copy in `packages/agent/docs/pico/v3/` is canonical. Two companion +documents in the same folder were written after this handoff and take +precedence where they overlap: + +- `view-and-events.md`: the watch protocol, the single view document, ops by + path, named events, the commit-by-commit mapping, watchers and late joiners. +- `plugins.md`: the harness registration surface, the four durable primitives + (entry, checkpoint, slot, namespace), tool/hook/custom-kind/entry/namespace + extension points with examples, unregister/re-register/reload, and the Chord + facet layer. + +Specifically superseded in this document: + +| here | replaced by | +|---|---| +| Accepted direction #3 (separate `rewindable`/`sticky` view fields with separate op lists) | one flat view document with `config`, `inbox`, `turn`, `compaction`, `tasks`, `plugins` and one op list (`view-and-events.md` §2–§4); the storage split stays | +| Accepted direction #2 "live task slots ... in the view" and §13 last paragraph (`TaskRef` slot typing) | slots remain, but the view publishes kind-described `tasks[id].status` via `describe()`, never raw task records (`view-and-events.md` §2.2, §6.6; `plugins.md` §4.3) | +| §9 Watch protocol: envelope shape and `applyDelta` | `Envelope { seq, ops, events }` folded with `applyImmutable`; the active-transcript definition and capture rules in §9 here remain normative (`view-and-events.md` §3, §5, §9) | +| §9 bounded capacity / overflow-close | retained for in-process watches; with Chord `ReplicatedState` as the transport (`plugins.md` §6.1) Chord owns sequencing and gap detection | +| §13 plugin state (`plugins[pluginId]` slices, extra document shard) | `h.namespace(ns, defaults)` tokens, `tx.plugins(ns)`, `tx.emit(ns, …)`, lazy seeding; extra shards stay deferred (`plugins.md` §2, §3, §4.5) | +| §15 tool API (candidate) | `ToolApi` with `memo` (slot memoOnce), `waiting`/`memo` on `BeforeToolApi`, `waitingOn` on the tool slot (`plugins.md` §4.1–§4.2; `view-and-events.md` §2, §6.3) | +| §1 "install fixed built-ins internally" / registration at open | registration capabilities callable while open, before-`resume()` rule, `hold()/release()`, handler withdrawal and chain rerun (`plugins.md` §3, §5) | +| §16 `pi.plugin` handlers map | folded into custom task kinds; `pi.plugin` may stay as a convenience kind but is not the plugin mechanism | + +Everything else here (authority explanation, proxy lifetime, prospective busy, +display-only assistants, read semantics, phase-map contract, session line, +waiters, storage atomicity, terminal retention, strict types, context/sections, +tool/process behaviour, known defects, test matrix, deliverable) stands. + +## Accepted direction + +These are decisions, not open questions: + +1. **Fixed core.** `pi.generation`, `pi.tool`, `pi.post_tools`, `pi.collapse`, and the Harness methods built on them are fixed and unreplaceable. `pi.job` and `pi.plugin` are built-ins too, though they use ordinary-task authority. Plugins cannot register any `pi.*` task kind or replace a built-in. +2. **Document state.** Keep Chord-delta-backed session, conversation-rewindable, and conversation-sticky documents. Keep the core rendering fields (`inbox`, `turn`, live task slots, core config) represented in the authoritative conversation view. +3. **Rendering-oriented view.** Keep `rewindable` and `sticky` as separate top-level `ConversationView` fields with separate Chord op lists. Keep commit deltas easy to fold and render. A renderer should not reconstruct turns by correlating unrelated channels. +4. **Phase-map tasks.** Keep `initial` plus an exhaustive phase map. Do not restore a separate handwritten `execute`/`recover` pair. +5. **One implementation, few capability views.** One internal `TxImpl` is desirable. Expose narrow host/ordinary/core transaction types or façades over it rather than a large hierarchy. Runtime checks remain authoritative. +6. **Extensibility.** Preserve custom entries, custom phase tasks, tools, core hooks, system sections, typed config, jobs, owned conversations/subagents, plugin state, and compatibility with separate Chord RPC/presentation services. +7. **Single process.** Do not add cross-process locking. Document that a storage path has one owning process/session at a time. Reject a second Session over the same Storage object in-process; behavior from two processes opening the same JSONL path is unsupported. +8. **Commit-granular document history.** A fork at an entry sees the final rewindable document state of the atomic commit containing that entry. Document this explicitly. Do not reintroduce per-write `Seq` or rewindable-before-entry ordering unless a concrete failure demonstrates it is needed. +9. **Separate stable IDs and commit sequence.** Object IDs remain stable identity. `Seq` orders atomic commits and watch envelopes. +10. **No terminal pruning.** Terminal task records and outcomes remain durably readable. Terminal checkpoints may be dropped once no downstream contract relies on them; `ToolInput.offered` already removes the generation-checkpoint dependency. + +## What `boundary()` and `resolveInputs()` mean + +These are core authority and must not be exposed to ordinary tasks. + +### `boundary(conversationId, at, headBoundary)` + +`boundary()` implements inbox placement at a safe turn boundary. `headBoundary` is the current retained transcript boundary, supplied by core code so `boundary()` performs no storage scan after same-batch appends. It: + +1. reads the ordered sticky inbox; +2. finds a queued self-head write (reset/handoff) and marks older steer/follow-up inputs stale; +3. selects every passive write, steer inputs according to `steeringMode`, and at a final boundary follow-ups according to `followUpMode`; +4. places selected entries strictly in global input-ID order; +5. updates their durable `Input` records; +6. removes selected/stale items from the inbox; +7. returns trigger input IDs and whether a self-head ended the old input group. + +An ordinary task calling it could drain input in the middle of an assistant/tool exchange, stale requests, place a reset at an invalid point, or consume triggers without creating the required successor generation. Only fixed core turn code may call it. + +### `resolveInputs(ids, resolution)` + +`resolveInputs()` controls the durable lifecycle observed by `InputHandle`: done/unanswered, answer ID, reason, and detail. Generation, post-tools, failure, termination, and abort paths call it only when the corresponding transcript/task transition commits. + +An ordinary task calling it could claim another input was answered by a fake entry, abort unrelated requests, or wake waiters before the transcript contains the asserted result. Keep `setInput`, `resolveInputs`, and direct input-table writes core-internal. + +## Proxy lifetime requirement + +`Proxy.revocable(target, handler)` returns `{ proxy, revoke }`. After `revoke()`, every operation through that proxy throws `TypeError`. + +Revoking only the root document proxy is insufficient because a nested proxy can escape first: + +```ts +let escaped: object; +await c.commit((tx) => { + escaped = tx.rewindable(c.id).plugins; +}, ctx); +// Revoking only the root does not necessarily revoke `escaped`. +``` + +Implement a transaction-scoped **revocable membrane** over the cached Chord tracker: + +- every object/array returned from a document proxy is wrapped lazily; +- all wrappers share one active/revoked state; +- preserve object identity inside the transaction with a `WeakMap`; +- mutations forward to the underlying Chord proxy so its tracker still records ops; +- at transaction finish, callback failure, validation failure, or storage failure, revoke every wrapper; +- retained root or nested handles throw after the callback; +- no raw nested Chord proxy may escape through `get`, iteration, descriptors, or array access. + +If a correct membrane is too invasive, add tracker-level revocation to Chord so every nested proxy checks one tracker lifetime flag. Do not rely only on documentation or TypeScript to prevent escape. + +Tests must retain both a root and nested object/array, mutate them after commit/failure, assert a throw, and prove no later unrelated commit persists the attempted mutation. + +## Required hardening + +### 1. Fixed registry and token identity + +- Install fixed built-ins internally. +- Reject duplicate task-kind names. +- Reject plugin task names beginning with `pi.`. +- A user-supplied `{ core: true }` must confer no authority. +- Use current registered token identity for typed task creation and hook registration; a stale/redeclared token rejects. +- Make hook and registry unsubscribe functions idempotent. A second call must not splice/delete an unrelated newer registration. +- Reject or define replacement semantics for duplicate tool, entry, and section names. Unregister must only remove the exact object it registered. + +Tests: attempts to replace `pi.generation`, forge core authority, use a stale token, and unsubscribe twice. + +### 2. Capability surfaces and scope enforcement + +Keep one `TxImpl`, but expose at most these author-facing capability views: + +- **HostTx:** reads; plugin/application document state; passive `write`; create ordinary tasks and conversations. No direct core task creation, entry append, boundary, or input resolution. +- **TaskTx:** reads in the task's conversation/owned subtree; own checkpoint; own typed slot/plugin state; passive write in its own conversation; create ordinary tasks and owned conversations. No admission/boundary/input authority. +- **CoreTx:** internal full authority for fixed turn machinery. +- Abort mode must have its own runtime checks even if its public type is an `Omit`/narrow view. + +Runtime authorization must cover every method, not only `appendEntry` and `createTask`: + +- `send`, `boundary`, `setInput`, `resolveInputs`, raw core document fields, core task creation, and core entry append are internal; +- ordinary tasks cannot mutate `sticky.inbox`, `sticky.turn`, or another task's slot even via a cast; +- a task may access only its conversation and conversations it owns; +- parent selection for an owned conversation must stay in that subtree; +- host APIs invoke fixed core capabilities through internal tokens, not user-controlled strings. + +Add `kind` and an unforgeable invocation token to the internal task invoker. Every runtime commit checks that the token is still the active invocation, the task is live, and an ordinary run invocation is not marked. A captured runtime cannot write after the method returned, after terminalization, or after a durable mark. + +Tests must include malicious casts so runtime checks, not only TypeScript, are exercised. + +### 3. Prospective task/turn state + +Fix `busy()` and boundary decisions to use the prospective state of the current atomic commit. + +Concrete failing trace today: + +```text +generation terminal closure +→ tx.write(notice) +→ busy() sees the same generation as live +→ notice is queued +→ generation terminalizes +→ no boundary remains to place it +``` + +When executing a terminal closure, the current task counts as gone. A same-batch terminal `task.patch` also counts as gone; a same-batch created live turn task counts as present. An idle terminal-closure write appends immediately. + +Regression tests: + +- overflow with nothing collapsible appends its notice and leaves no inbox item; +- an idle job notification appends immediately; +- a same-batch successor generation keeps the conversation busy; +- no input/write becomes stranded when the last turn task terminalizes. + +### 4. Display-only assistant entries + +Provider-error and aborted partial assistant messages are presentation history only: + +- they never enter model context; +- they never create tool work; +- later requests do not include them. + +Prefer omitting `model` and storing the display message in strict-JSON `data`, or add an equally explicit non-context projection facet. Do not make `deriveContext` infer this from an arbitrary error string. + +Tests: abort/error, send another input, inspect the next provider request, and assert no aborted/error assistant message appears. + +### 5. Read semantics + +Tracked document reads have read-your-writes inside one transaction. Keep that advantage. + +Apply one rule to every read: if buffered writes can change its answer, the transaction must either provide a complete explicit overlay or reject it. Do not silently return committed pre-transaction state. + +Maintain complete tx-local overlays for direct object reads: + +- `entry(id)` sees same-batch entry creation; +- `task(id)` sees same-batch task creation and every later patch; +- `conversation(id)` sees same-batch conversation creation; +- `input(id)` and request-key lookup see every same-batch input creation/replacement. + +These direct reads remain valid after writes. This is required because terminal closures append their result entry and then resolve existing inputs. `putInput` must update both the ID and request-key overlays, not only `writes`/`effects`. + +Scan-shaped reads have no general overlay. Reject a scan only after a buffered write that can affect that scan's domain: + +- after an entry append: `newestEntry`, `scanEntries`, and `context` reject; +- after a task create/patch: task scans reject; +- analogous future table scans follow the same rule. + +Use a named `ReadAfterWrite` error and poison the transaction even if the callback catches it. Refactor the known offenders: + +- threshold-collapse selection reads context before appending the assistant and carries the result into the terminal closure; +- `boundary(conversationId, at, headBoundary)` never scans storage: the caller reads the newest head before its first append, or passes the materialized ID of a same-batch self-head entry it just appended; +- while placing queued writes in ID order, `boundary()` updates its local head boundary after each selected head write, so later explicit-head validation sees earlier same-batch heads; +- `send()` performs request-key lookup before writing; +- generation/post-tools compute context-dependent decisions before appending; post-tools passes a same-batch handoff ID as `headBoundary` when it just appended that self-head. + +Document reads remain exempt because the tracked proxy supplies an actual overlay. + +### 6. Phase-map contract + +Keep the phase-map model, but encode phase role rather than relying on comments: + +- a normal phase can be reached by a returned `next` transition; +- an in-flight/recovery phase is written immediately before an external effect and is entered by the scheduler only after reopen; +- the scheduler rejects a normal transition into an in-flight-only phase. + +A transition builder may atomically return: + +- a next checkpoint; +- a typed completion; +- `"retry"` when its snapshot became stale. + +Add an explicit `Carry` facility if it removes repeated unchecked destructuring across phase checkpoints. A kind method or terminal closure that returns an invalid shape is a task-contract fault; do not invent an untyped `{ reason: "threw" }` outside the kind's declared failure type. + +Retain and expand the existing recovery tests for generation, tool, collapse, job, post-tools, marked tasks, and ordinary custom tasks. + +### 7. Session line, failure, and cancellation + +- Every storage interaction, waiter registration, watch capture, registry mutation, reservation, and commit enters one FIFO Session line. +- Known nested Session-line entry rejects immediately. +- Check caller cancellation before queuing and again before invoking a transaction callback. +- Once persistence starts, call `Storage.commit` exactly once with `withoutAbortSignal(ctx)`. +- A storage commit rejection faults the Session, closes storage with a non-cancellable context, and makes already-queued/later operations reject `Faulted`. +- Callback or validation failure before `Storage.commit` discards the transaction but does not fault the Session. +- Listener, hook-reporting, watch, and scheduler callback failures never turn a successfully persisted commit into a caller-visible commit failure. +- Do not swallow document/tool-stream persistence failures. The current `flushing.then(...).catch(() => {})` pattern must go. +- Enforce one owning Session per Storage object in-process. Successful close/fault cleanup releases it; failed close keeps ownership. + +### 8. Waiters + +Register waiters atomically on the Session line: + +```text +enter line +read current task/input/idle state +if terminal, return immediately +otherwise install waiter +leave line +``` + +Cancellation only removes/rejects that waiter; it does not cancel durable work. Handle an already-aborted context. Add deterministic tests where completion is forced between the old read and registration points. + +### 9. Watch protocol + +Keep the rendering-friendly `ConversationView` and Chord document ops, but implement the settled watch behavior: + +- capture and subscription are one line operation; +- committed envelopes are delivered in commit-`Seq` order; +- one commit produces one envelope folded into the view before the listener runs; +- listener execution is off-line; +- listener throw or decoder failure closes only that watch and reports through `onError`; it never rejects the already-persisted writer; +- bounded capacity (default 256); overflow closes the watch; +- no cursor, replay, acknowledgement, deduplication, or resnapshot protocol; the client opens a fresh watch; +- `stop`/unsubscribe is idempotent; +- no callbacks after close/stop. + +Define the initial entry capture exactly: + +- Let `H` be the newest fork-visible entry carrying a head. +- If `H` exists, the active transcript is the chronological union of `H` and every fork-visible entry whose ID is at least `H.head`, without duplicating `H`. `H` remains at its actual chronological position. +- If no head exists, the active transcript is the complete fork-visible transcript in chronological order. +- Capture walks `scanEntries` pages newest-first until it passes `H.head`, using the same fork-aware ancestry walk as `deriveContext`, then reverses the collected entries. There is no public capture limit parameter and no internal fixed cap. + +The captured transcript must retain all of the following: + +1. fork-inherited entries when `H.head` points into a parent conversation; +2. chronological order—a summary/head entry stays at its written position and is not moved to the front as context derivation does; +3. inner or older head entries that remain inside the active range; unlike model-context derivation, the view does not drop them; +4. display-only entries, including aborted/error assistants, `pi.usage`, and model-less plugin entries; +5. every entry's edits verbatim; the view is the transcript, not the edited/model-message projection; +6. every later committed entry for the lifetime of the watch—there is no live cutoff. + +When a committed entry carries a new head, `applyDelta` truncates the existing active transcript using this same fork-aware boundary definition and then appends the new entry at its chronological position. It must not apply context derivation's special treatment of heads. A fresh capture and a client that folded every committed delta must produce identical `entries`. + +Add a regression with a child conversation whose newest head points to an entry in its parent and with an older head entry still inside that retained range. Assert that capture includes the inherited target, preserves both heads in chronological order, and equals the result of incremental folding. + +The view keeps fixed core fields for rendering. Plugin RPC/presentation DTOs may filter or project it through normal Chord services. + +### 10. Storage atomicity and JSONL recovery + +No cross-process lock. + +MemoryStorage: + +- validate the complete batch before mutating, or stage into copies and publish only after every write succeeds; +- one failed batch changes no table, document, ID high-water, or commit sequence; +- stable IDs never reuse once committed; callback-minted but uncommitted IDs may be reused only after reopen. + +JSONL multi-file publication: + +1. Assign one commit `Seq`. +2. Append and optionally fsync all sidecar records for that `Seq`. +3. Always append one `main.jsonl` record/commit marker last, even if there are no main-table writes. The marker lists the sidecar refs expected for that commit. +4. The main marker is the publication point. +5. Replay uses stored `Seq` values, validates monotonicity/shape, and applies sidecar records only when the corresponding main marker confirms them. +6. Unconfirmed sidecar tails are ignored or truncated. +7. Physically truncate bytes after the last newline before opening for append; otherwise a later append extends a corrupt torn line. +8. Sticky sidecar rewrite/truncate runs on the Session line and cannot race appends. Use temp file + fsync + rename as appropriate, but no directory/cross-process locking is required. +9. Carry committed ID high-water in every record needed to prevent reuse after retired/unlinked sidecars. +10. A malformed complete record fails open; a stale retired task sidecar cannot resurrect state. + +Add fault-injection tests for a crash after each sidecar append and before/after the main marker. Graceful `Harness.close()` is not a storage crash test. + +### 11. Terminal task retention + +Remove `pruneTerminal` behavior that makes terminal tasks unreadable. `getTask`, `waitForTask`, task scans, dependencies, and typed outcomes must continue to work after arbitrary later activity and reopen. + +Reduce retained size by: + +- clearing terminal checkpoints when safe; +- storing compact complete terminal records or validated patches; +- unlinking live-only task sidecars after the terminal record is durably published. + +Do not infer that every outcome is represented by an entry: job and plugin task results are not. + +### 12. Strict durable types + +Harden durable positions without rebuilding V2's entire address type system: + +- `JsonValue` only; no durable `unknown`; +- `Stored = JsonRepresentation` for imported pi-ai values; +- stored entries/messages/tool calls/usage/deferred handles use `Stored`; +- task input/checkpoint/result/failure/aborted values extend strict JSON; +- tool details, plugin inputs/results, document/plugin state, section payloads, and process state are validated/encoded before persistence; +- readonly durable snapshots at public boundaries; +- no `any`, no inline/dynamic imports, erasable TypeScript; +- use the repository's pinned `typebox` 1.x API after checking its installed types; do not use `@sinclair/typebox` 0.34; +- `ToolDeclaration.execute` receives `Static

` rather than `unknown` plus author casts; +- replace `never`-parameter registry erasure and unchecked casts with a small internal erased adapter whose validation boundary is explicit. + +Make the standalone `tsconfig` portable: no `/home/claude` paths, exclude design-history sketches from production type checking, and include a real compile-test command. Remove unused `partial-json` if it remains unused. + +### 13. Config, documents, and plugin state + +Keep fixed core document fields and the flat typed `c.config` facade. + +- Derive/seed defaults from registered kind definitions rather than duplicating them in `defaultRewindable`/`defaultSticky` and kind configs. +- Deleting/unsetting a key restores its declared default; only model remains optional among built-ins. +- Do not use `value ?? default`, because durable `null` is a legitimate value. Test property presence. +- Custom kind config defaults must be visible both through `c.config` and to the task itself before any explicit set. +- Reject config-key collisions at compile time where practical and always at installation. + +For plugin state, first implement typed/namespaced slices inside the existing documents instead of recreating arbitrary value/list addresses: + +```text +session.plugins[pluginId] +rewindable.plugins[pluginId] +sticky.plugins[pluginId] +``` + +At minimum, associate an owning namespace/type with a plugin or task-kind token so typos and cross-plugin writes are not silently accepted. If a plugin has large independent state, support a plugin-declared extra document shard using the same Chord fold semantics; do not add this complexity without a test demonstrating the cost/isolation need. + +Associate a task slot type and initializer with its task-kind witness. `TaskRef` should determine the slot type; remove caller-invented `slot()` casts. Core turn/tool slots remain fixed and rendering-oriented. + +### 14. Context, transcript, and sections + +Preserve the current centralized context derivation and full system-section design: + +- head/range/edit chronology; +- newest edit wins; +- tool results reordered to call order; +- missing fork-truncated results synthesized; +- messages-only requests; +- managed `pi.system` baseline/delta chronology; +- preparation snapshot/retry loop; +- historical tool additions/removals; +- section seeds before first preparation. + +Fix and test: + +- transcript/head invariants before persistence; +- display-only assistant exclusion; +- complete active transcript capture; +- private conversation section-seed metadata (do not expose it in public `ConversationView`); +- `SystemEntry` typing permits metadata-only `model: []` deltas; +- ancestry/subtree hook reconstruction after reopen; +- registry changes are line-serialized and preparation revision checks remain correct. + +### 15. Tool and process behavior + +Keep `ToolInput.offered` and the persisted final validated call. Recovery from `started` requires persisted-safe, current-safe, and current-schema-valid evidence; `beforeTool` never reruns after `started`. + +The V3 tool API is a candidate, now no longer an unspecified gap, but harden it: + +- `beforeTool` runs before `started`; a throw blocks; +- kernel owns bounded streaming; +- fix tail retention so a single chunk larger than `maxBytes` is sliced during `push`, counted as dropped, and never retained whole; +- enforce both byte and line bounds for streaming and returned content; +- no swallowed flush errors; +- a tool cannot mutate call identity or protected turn fields through `progress`; +- the final tool-result message is bounded and strict JSON; +- use the stored final call consistently for invocation/recovery evidence; +- preserve fixed five-second job TERM-to-KILL grace, optional `ProcessHost`, and polling capped at one second. + +### 16. Known implementation defects to cover + +Also fix these concrete issues found during review: + +- `Harness.waitForIdle` has the same check-then-register race as input waiters. +- Reopened owned-conversation ancestry is reconstructed incorrectly by looking for a conversation whose ID equals the owner task ID. +- Listener invocation can currently throw after persistence and reject the writer. +- Scheduler drain/abort errors can become unhandled rejections. +- Ordinary kind throws currently manufacture a failure outside the declared failure type. +- `createConversation` and document access omit subtree validation. +- Hook matching by name accepts stale tokens. +- `config.get` treats stored `null` as absent. +- custom kind defaults are returned by `c.config` but are not necessarily present for task document reads. +- `SystemEntry` witness requires one model message although metadata-only deltas use none. +- JSONL replay ignores recorded sequence values. +- sticky truncate currently runs outside the line. +- use `rt.now()` rather than ambient `Date.now()` in kind-controlled durable records where determinism/testing matters. + +## Required test matrix + +Retain all existing behavioral and recovery tests, then add focused regressions for every numbered hardening section. At minimum, the final report must show: + +1. runtime tests for memory and JSONL; +2. strict TypeScript compile tests for public capability surfaces, kind/config/hook/task-ref/slot inference, and strict durable JSON; +3. fault-injected JSONL atomicity at every publication cut; +4. escaped root and nested proxy rejection; +5. stale invocation and post-mark commit rejection; +6. malicious ordinary-task attempts against every core-only operation; +7. waiter and idle-registration race tests; +8. ordered/gap-free watch capture, listener throw, overflow, stop, and reconnect tests; +9. display-only assistant and terminal-closure write regressions; +10. terminal task lookup after many retirements and reopen; +11. real TypeBox validation tests; +12. the existing generation/tool/post-tools/collapse/job/subagent crash matrix. + +Tests must not use real providers, API keys, or paid endpoints. Fake models and process hosts only. + +## Deliverable + +Return a new zip containing: + +- the hardened standalone implementation; +- portable `package.json` and `tsconfig.json` with pinned dependencies; +- all runtime and compile tests; +- updated README and usage guide describing the fixed-core/document/phase design and explicit single-process assumption; +- a concise `CHANGES.md` mapping every item in this handoff to code/tests; +- production LOC count excluding storage backends and tests; +- exact commands and results for install, typecheck, and tests; +- unresolved questions or deliberate deviations, with no silent omissions. + +Do not modify `packages/agent/src/harness/pico` or the approved V2 files. The returned zip will receive another independent review before incorporation as `packages/agent/src/harness/pico3`. diff --git a/packages/agent/docs/pico/v3/harness-v3.zip b/packages/agent/docs/pico/v3/harness-v3.zip new file mode 100644 index 0000000000000000000000000000000000000000..d938dc224bda46927114833cc1ed52b89e5fcf7b GIT binary patch literal 176487 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

$%#p!D*EX)`m_>*Y&J z&|7zCKP=O};gK~bIa9qyJE*cg5!A`7Etg@_y6#d_ag4>xO_o01bd+FRlI^;hy!9}j z9kqRzJ_sUvR9nzF$@yr&ncK=2R4C}uvf0As;?;dUaW2W;vg~hfP2;=2QEff2(K&31 z6O@)^ykheZC8min+zdc1K-%P;Ya>2vC=*!ZeV7*#fD~-?D3Dv#4#It z$xwfdaZoprNz2Wfc1bvrF01qDt#M9hX3JY(u5-hEGvn;Uw(|FLSWrD|vb~bRhn7L) z?zoHxDVeK#Lz!y!=sK!_>I%bUO|=*05mpB(-#wE{ZeM2?Q zI?L2yqfiJF{P(12!3RGNv|IHCed*QB5?Ab09cbg2F|u;wxhlOW*jQ;`7`m$>NjY@_o0})6E zC2n-9G6<#K4pqfNW4V$pp9V;@10!RI79cJIa3ABEbX1aPY4zhX*!=9_$$X3-TR5&SKo4{2H9xrJ56o!zqNZ4Y>vfjDWo z=LtI$`ADezU%c>+)aGn1C!|ToKrgDRxI1N3r{Uslo@`2+Xe=d02C4S2wbpHErERnr zQp3cDB&Im#8I*%x8Ano`!QoVEI0B}+3vCzS3b8LT`j;3Rw|F5OXM(87X|NoNA3_(j zgGEtQw5AEc?7YL1C)S0U)?yqJmdd_Mwpi&>Bcp+D%VJpJ*Tc)UL+FiB1@E5I#V1=d z&U>)5s;J4Z*X4RO?T53F%4BmWCK{5Pp?RmhOh0NMK-9S>Y8CP3f){eyYki$#_)uH%r=< z+uH0Usm&Uv@%I}Tf4G)}pRcVjVXIbEX>|Bz+ktb=gkhJ+_?n zSCyJ+lv)$>inZ&R**zmT=IZZ^z6u}hRrnj9&%9i?1^M}fB`Xatgn-YbFm_fFo1nbb%a(%&r z;OLB@eDrU7D%2L3aPJoe6M_MqX7Bp# zua{-m7;^|x6k!%_K>U7mNaF}Q$krA8LRhx!yt@6g-t^ZvxQiz+jqU?*(=E)3rmUJE zJFa{f5)|Nf)#-<>SIuM;TNkj$GTYYs_5r{%om^j_MsmK>koCl$-y&)Sd_v99) zi(7n=mr6l%c@IVk959|3Z341XGI0I-cCA8Ez>AqIM>#vWtY|u~Q$3mv%YEpzaNRG> z7_8Us34#`%m&{ww8WimOWzdPvp}w5%Hz!*Zb`i^bwGtpMvOIP(*t1TVksiqZY@Wmu zzasJxSHbY`P@yD(QjuKXTinDr=gx(I-1FCSy+**nq66H7@0IOwU$X9!yB6^UsBhDy zM?L)b*avY!2QnZS7ZpiyGC$IbbI3HgdTcgh&nF9Q@7-$$cZC>U78wup43os?uC5hJ#EmaZK2UFm{YROqt8%Hs&~< zVbb(eLOD8fw*|{?xW#f+Un}9O&9&A3X!<8xsCxr?GtLS#rfKfWDKa5P;98bUC-@W^ zEa7Jv4>c>h%}w6vvT8Ek&TsW`ih?bn$1KcZe&b<4y7Fw95bQ{ zh|pXd*sZSc&P>}pBO5eDKHQZ0lTzBXw{~f|E6Qa8!|G5O35T|4sMVq82;Fk5-?dwj zVk3-I!VJ-H`ANdX4p16E$&p65D7HD~a-@aF&_fP|t8gSyxz*jv)*2fWviFt%+2pH- zAK(iCe(1h3!SOZy&56Si7q{#Ue)X`7aoQvOP1X8{x3e zy83ugcS4Qfv5*t?C5RF=8f}!~j84dHW;eq**Qfd)ChIUn4(o!LUk;&=Ib=;e_O6W` z{bs@vj0B)Q&~UwxQA;RTuJo+JX@-gux7@)PC|7(`Gj3+hiR+)ovvrLkkNSx&OUcUx z#4e}B)uEM=F$MC=S&OvD8tq7Mb>>tN_JFM=>0V`1HDP+KrMCI7ownDwuw^D;3coV^ z=n-}77rugR+JfytNb4M!wvzcr=vcU6B-|9s$+*ahyzh#mCgqqw3z!B=UIkz;O2dIM zqzF~$6Bs{+(nB;3t@kHN6tUeTVzB)=)ANnFDDw_Q01G1sQ-&}e% z57X@03c0XV();l8YiM8IcuhYx8qNwtk!67G zpxrv;`IX7xzK9xogwU7k@I_8!Q6-tvRsquA(cv?0xTIDciaBC1un-!PO2Sb6nZe_I z^v}SZQjVw10ZAAzu5K>(sXsUi=;37+!V1cD#B%t2pR0DlXJF>l4aLUL`VB60A3fXy z>U5yf;1F;Q2@hEx+^ySF0y0Cvg3-E+^OAAo!oL_N1VuH~8ddk=rfh3Gpe4)ISRZK} z`04$5g@04a?Bg;XB{O>Lh0i++ylw+puZb9~(V5!T=ma?t-*B+j0QfD@^g2jMkHOWd zf7f7d)yiQQwqcuId-7>7I+6#FvVnXs3T;u^#qdBAMW9p!gCI5C>=l@hHKjE62BZ=%s~;)Ao{#=BagDT7L(G_k#O= zUVbhcF3y7Jz(1d!DtGmC(e+alsebWFsf&f66@ya9iiBI=fIQL9qg0~5-;p%qQCgs# zEY-Xy!fV@?PNYPfNgtIt@uT^_mpp@navoic=a6U|f%R~>LMU59+!S*A$$kI+jTc@S zBpmqF&YnwycMD49v}VTorA!&S4Wl6Di00dWCb2ByKl$Cwl*);e6_yfq#=cn&n?q&} zMiEC#O{sE7snU~@9WEvmWM3_>Hl|}0x1Id=)`Lbg%ibi_r8r2-s9h0cm_|BX0Sa0y zrl+_L9cXz)I6pmBRN^M`xam3wuQVrwMF_K%ElAlN&PUz~ zd9Uvoya8^Lwm@-MMqJZEdEg78j&nB?b9nS@7m^=!*rO04GL|qQXuTX`cf}Ik+%JEn z#mL&01M}q(4)o>Z?`zn-Oj4@#H@zm|^pgt+r}y&5I_lxMG5xV+^6H;^Coz5bI(!$( zkVc6q_3W?*>w0|D~pp5AFo(?oTV9UQ;^D=}8 zs|-3^vIrXt!j=AG1y+(cg+-vxncWFC6%1w#`e&_@(=!Cj$YyGc@0Q-T4 zG}f^B?-qJ9mR^HCDEtK8VS1eO6d~>r4x6*VAWJ$|!csnLb8aoON4s2-D^ml;PNR!j zNhaPFx&ng0z081>Sa41hlQKCgYB8{O@BKPR1HydwI$YbM8{a4#YkKOSg-7?cp|Foa z&5gF-pry|BkL6lm8y~j!HNe773o?$5mRaPRo;YZuyAU1(XgQ$=#`C9efIy zn<2E#Bb4PMZ99jKQpDy~0Ap7QiGfmW`G^HI8;T+xeXuJ@vX4@cuA7q@zZ`705{wk_ z@5-J`Tf_8m){z`#;$$e9{_*eFRdaPnNWZ#R%0hdr=DAP*8+iyy!HaiXt>*h$r``-G0vQ7T4cvcaeH2)9NXu zwtY%K76`GsF7x2|>#JH~Tn2l;>0?3;ANi=!!Rgopu7sPAQDVB_Y>2@gjE z9C+i=RLlZT?ARuj4hy!{GWX!W>_K0cw%7{*n+OQ^B}}lVsn#67yXcsoGBME#L{FO2PP*Pjw9qab>rNr|Z0wm(3O7_Yu zL>d6o)}QW0O8J3*YI)k`!BAnz>VA)GHe^St`wC5Syx{TTW83&oDxE!Soh6w<`9!?6 zAQq*fk?}mb1DNpnaJ8=J)o?z-oJtAMs1=~0KmG<*DFtmUHj35RA?}K&$fl=TfP~q} zsm$JNEOz)gavOLe$=y5pI1#}T8SBI5S8#A0G?W8yxDW})!PC^9g-HPgtgLE*A1&^& z$=l}m;aM@(dzNY(!iFp``@L+8Dpx|`e!n3sK+M}x7^vNpg=vwHGQlwpItjCr9!wX5 zyNN(URK`>PWaK8?Q8TIC8Va{W(RYVaq8{Oor8C(M>MPs11xB3MxNFe_Eil3V+@CU( z^XU3=w?A_$p%Vi*&sTS`1C3SSz+T@s>uGckS9h6eN#$(codeBBoIw8<0ftDm_b>~I*z9A$Y1?cTiT8!(vvU1W|#7zRY5M| zCBkK->x}~DYx^w&qNexs%Wd&T~0)^_FRC?_5z8#`Kd)gjwimK$+{rZj!ekPoslKZ&;P70^KNxsyx?XR-SHB(mV<| z0yK~!Ylc;~`^-9CE|uQ4;;IM)G!grjz6ZO$Kar~=oE>}cg%T-EzuC?58z_^~dCdk( zoJqkyJq5y>3JnU;j8><+LA#t&U4==2mspt~-v-9sD1I-XABFc!tby0tYc65At=Dv< zVsL*XRVQU$N~ngDKr^sI);^vqkIh`ZayepgE~_xw3slw5V<6fF{LijOhW%gb`N3Kr zzzg0Dj#q6QH+3~8$?btm<%L|%6nEc-+OZ{*0eG=V=6bPZ(vg)AD$x>9Hte0s;zXSq;g*I zA^^`Y#F?&$E7fClFaQ~N=w#aDu_DJg;`G2F$mL9gR8s*(5s$L+#AV?hkBMgipA7U7 zLZGx=eycCIfQcq@Njhym4Nzq$kHYuJXaP++Xam2adxW^9Ohj%%t9qOO@f;HwnU<26 zHnl%jt3wJE?Ug=8YS?f^{0dTc9`7e|-PFL*3%9}sq~4|{KjIY@r1*%R$x6h)Ni4!$2*u{>;&@<(2anj9b_op=sT>AnX% z=a2UH89vz>vmE>NcIKYX#yPFJBe%H1@J!lx%QLLbTac;9KnAx3cj=F*IQ_Ms5?Mkmm&%SDBb2MV!97UpEof1COipmZw9{YZY9PO2Gd z#nBk24+~*#XjEi{RH&e4Jj?k7VHpJY`1b-p3l6e;tfL@#t$8v_Hp4A_mD2=Eu*tgH zsEBvku9C}15lrU79EL&rKMln)k9dLKh`Q~!IEE+(k35KjQ`}@%)3$p7xb3Bx{_#*- z6b97UQR)p%GTr(iN&S*E(V8AFV1hv+*2vn`@uh0V74DFqT3yHbPSYw*fQ8z&b@ruW z(<~Re47r1~zs^OReq&oi!lLA8S*!7)DSL~D?*mJDD%Ku8bU$A0Q;mY!HZ$AYc}18> zBH&tQtSh?&aYn&LC>Q()0K)ch#WUTa2BxG)@8$1>X39GJ#2DN7-&!Qb@^eVQ36vy; zVfB(vs$9z`{-Q*WmeK|RnFdWpCzirrF(KwbCN}Rc2cck4Wnib2THvIvZL4N%h#?vR z=@f1nLySHwG~#s@pFDHYn-e3LQ?w)@0c2ES!RHs%RBSd8{P+}LRBA)BA1V3ykh>|D z1PkD!P^@yOiiv)umlpVw!Tj^~2nRWwA9}9mV`D+Mwb0JXfUpE>=x11@FzSP3eA&Om zP;;V&OUZ829OD$TR;iL|Y!M!o*H?}2DmTsm#EQHZ+zrlML&Y5wLL)4_?$0e#%Og}} zC=M;O7Yb~q_B5`INg>s>u?S7`kftM1vJvvKSL9lkE972Rg$e_~pK#?1Q&y&6dsiYI zD%vfQ+fxk#L`X1}))6JGw1JUfC1ZvusbN?v6}z>HP2e|#4d*4M62+)lK+~*)MWZ2h zXy`boe(k-|h1`-YW91fR)%;7xot~_*{WMe0LKJf9d&}8q*fdEdPO5y%aoWf9XcXCC z^F{Qd6|6Jd{pB7GcG z$3E3Wn7Y8`C_ZTBi$jg zC=8Qt2Gc^T;Pr$m_}EjoX1GCs*=;6~5P%)D+$_=>Vt#m?tvBQ?gCDRGmfbFd6WPp% z(_b2zR!%E=my8!nVx^nE%~$4*jstu!n-e;-OeNd(C4}5 zsVW%y9)4$*WNZpy+HsIR#((_Gk)7XK&EAa?~C zdWCT|E5HK$%CeRpt;OYYY*q`y>4Bl%{d!;O7UI68tZ zB}m7s#G2FClD46)Y7o6DNi)4{1mPi^nyf3@Am$5UIoPq&9mXj+L<pTdW7R!y)4?oGiJ-Kzb8cx+zNlaSlUKg9* z8W2Dl=CKOj+Tj%GKa$x+(<}FFx&drAVPm9_gro&+ zsQ=y=ukxRFl9@V6CE>qn6ph0(J$H;>^!+{#gRzb;@nRK+V+tA(2DS76)fzJ0ZHch> z7x1}Mid+ou9C0^esLMks*nht652(Rxz@UmAducEkslR}hE>NVj!6u~UZ+vYh9b6M0 z^(Mr;tOqbSJAwnMV!RNhg#my=+e6` zs^uGF<>LCsmG@B$>W+LwKuU^uo`?I_o{Gx!nGf`xGwj2Ju|5+f1G94Q>g3}ZHVnP5;cft_R%Bcb69 z=dC|-JQI8wzSC?{vB;tp>8N_ zG^{;%g+GrjZqO_j`C_Sq%6pHQLo3+bJJ+7=?FnY-yl2H=bxMjhSLK?rJf*qGCREjUWB)|ZX`gPg;bPjskhP6Uzgr#8 zwR%oV6qed}e&2nKzA6rk@tL}}3e-Zt7Q3Voi(j{m(fWM{@Q$kT?Cpn=5WUbJ&`dMT zp4GbDf{x3^A-OS0=*Cylhbv8Ij)ig~*tg$!#{Y+~cL)-OiJElVwr#unZQHhO+qP}n zwr$(CZF9aGH)b)jn7{V5tf&)tGV|fgyO`a{uMMC(_~y^QbsG3Hp;mRjnpT~U?w~Rz z1S8ryNwp;+NgNWow}{}H88nZfMFW4CkyC%91;w> zwO-cWNoGy5tLJFgP1-5}1uBQQm!`qA)tHCTWoJ{DfYQc8o~89slI8?yG>;*C^Nyz| zqJ+Ec$cprjUHJ*!E0UvZG7M6-61V~<1-_<9829dnRxP{OGEs`cW#W=!QP&RrPNkWi z{dPpuQ#cIhJv=g+?k9of@Xy3Y^^CX>{^x=)*fj*DDk$m1EEO90{nAG1!f0KFoA?bO zopG{N#$hQ@7mndkj)P+H*s_tkL>di} zZW?h7I%<_s8S&%qSCA1#^TmeP2xNFFQBx_6cQu#fU@U;VMjp{oFUpvAjETd3dh%Lm zybSH3+yde<{?Ba<$cEv>&|sazSyictjsS|vB@V|N9#FLR43AW;A5s%Z#k`aBHJpx% z@qI<^fF%SSQ}Mdmp@f7wn+aVN3Bbu;TV{IOr&(E9j(k?EN6^>ypaU83%c0LHlGHv{ z)MpBgP=1Ce!AJ+_;NR~XD#%XBH&RZDXasM@DuT36bmkop(3vNOGRd4@bD(V&6`Y;Us(q*2;RHkI z`vS~ru0UnHH+7IGdDu{5*xHlR8&(U>j@|uKe-L0DbnE4ILZ1WB0xp1DxIyI8F3GV8 z->);{c%HUKf4G*cJ@h?k{vZTE!xU`Jb}Bw2&K=i}xLEQ*GQ#!xXhR~?YSjU8D-L9r z<|{#dFw@t`hDhp5_<5f82l>?q1#q(mh4bRAwchU3S&-M>WVDOF*_`#R7p>u__6JC{ zQ3UuUVWbPyWvhSwMFBph^!1L)f|%T`KyY|`!8%j<^4KP?>BaD%Cufc$^}I=%8{nny3ht%qCQF(02W# zg=g@Xwql#6U%cU;g;EAF_bYM=|A$OQlrmYwJnbXhs(LJK>+fmaBAqn((H=g+qP%>gH(?#2m1` zAVko!ysorz9=&uuKH2;JWf^2ZjW|2)_0Rl-ge1&&@~>82bD zuT(AcC{eZ=u~jCvlLpyDI~=~DBH5^WKxJ&;Zrp$R=OmL zj0C2r=TzVrf(OCd`3T0B3C}$?XXb?l4c!KiRvnoHL_$_~1k4uoz5@#jB`GV(L;TQ1 z3-Hf6cM?P|^Rp>}#K&eFS^h>v>+lLHdLJvH$?>SlGI!ByUv}xoRx7N&L@56ZmcsWj zg&C&`-^k3o!t#;MIiT{kFN%8a@7^DTSj=zvQW7Yq(oL!*Lpjy#OL|Toso|t870PTa z0#rI<3agnIMUjc6#)SzVdY6Q;zup<1nv;yb63R>#Kw#;&Q>%=T4CoR18?XZh4eD^O~yfwbX6MiM2wj_zBY5~ zF$xXthA!w@G_JcM4c32N9gBV549pqj=S(+QWn|)%q@NnDw5CbtHVK9j0-tuK&eCq( z?CA6=11c)=uA3DRNo!_lcVa3qo+L*s>^7{vsFnZ>@pqD^m(807f*f;T2Rb6MfV&bW zKb?3U;4B(rXW)3KdLbwWjdPi=Qqf_}{;S98+QEQlnW^*Qs7_V9ZNl1#_zxEHBiO{M zOOj`XH0`o#7NH(MXOdkS#K5o_rU}<2*DduaBCXwygpp8DoC802C=owe&c21ggyfUl zb(gvBJT5B&TvPY~4VKx2vTWE1)y8Sk+27d4%#8(x2vOgG@wrR_kBtOWO+$@4u4b2a zkpVFqGv-J))y?H5oo&t@fk}FG=VA6>URTjMrS-ZY><;{Rbze(Kl7WBlFjihvPvyNz-;uL-nTizeGCoBH}P3B>qwFzV#{Nu-s)fcl__gC=y8J9KWHngk)4d!PRsB$mvZh>bfWz%NwMo7|HjR zMXdg=a8!$I)xfay1xirA(S@j->Bf@SeMys9b0}ANoxf1HK6phORa7`eZA1S0lzZU1x;m7 zGMq5oSFhBZA_bM=Q^T(FP<%-PTMJBTUxG|$7^fdrNg(-3;6QIjIhsl9!nYI+GBU1Z zINTRMzWTKcNeIrPiL$hE+bhf5>A0% zI)Ss7MuUSHV#NE@ke22@PR9*FJ;CqbJIdG&27Ci8J`dgQxEB^S1$vbZ-PM zlMM|w|N6pW5yH_jOEeP3o!Y<2q(5NXOuUVWOmM#b?@&--r92gV5wt76c)Bi7*anz! zv@yY!AexcJYC@BVTo^19v_ez}0rIpGBqA=;f(zWBo~BWr>CC1ffX8jV=w4=sV*I9A zqgs0dRfoh+k?2%(GPv?d$1O%!!?xTSnMiQp(OkCcWs{nTW2c(zYa3rQ6LaL$US0lI zI+c@Q)dR*-(n9nWUU75TDvtbJRsjzavd&gs{k5v&IDqvqKY%3gHyCjAv*)=R_o zZAzRN1xQ-o)q%U>PnO+6U{|6buPN$5uO=c%XrrA>3P28>n5H#jjQnBZ@j0$rW@%iA z@RZQ&T^z%lAzfs_+WyZ4Mb^w8v+~b>qB}KE5bllu`&=eCQ5KU{u%yBczsf-DeLsb2-Mf=pL?j&NKZ!C(r|70$i#W@1E^5WL84adPMBogeClZZv z+l|z$DgnbSBM-bL?bfFfwfpsAU9gG(fz+O>Ev$WODR(SzS}di3aML20YUn_Y-u6uk zj=BGqkS~rf_G}e%K{w<^X2_Ta$IllU*X_V>RvnsbH238_EZNoRVucRKJVYRa=m==| zGiKikq}yY1yBLbkJwCjhM`G@Bp(}ba@z3GE&)qOY1G{fPb4vAlMQwtAjoesY)M&*Q zdXfO2T_&=ZKJK>@jJh;~(dPmZYVG!a4&Ubo|DTsw7LWHjXRmQhi=bIuW@^@LdPJ#% znJN^tlR`>A6*@*4Kh~KiG}s!*%nZJ!ZLuDk2kxzBrQ!Ak)G+e!H}$Igyld;0EXb!{ zODK0A7IQUM*3?N1XOJ7jRF)a6|J)4P>w7=RxN`nd)q#Z4V%b^w!jf8pPb?obPqj?sR8C_e1>d-v|cTs~&`NSg}(1OHo0t2+fBMS}TFY8{c>BHjF3!&)7qJTT6_ZpDQDG56e!H zV?P)~h!4*8tQKqFckRV(JM$8=i0AFb0@KQ=)e*Ya4(R0PYF4dS8jqYN><;P-o7+8_ z%ahp}MP*>0nE}mo`xGFh^3m^?H|ITC!GE+{Le$1ZY$wNS{f#2YsgQqFDhrc?%llZ; zfr=_lS0xq7I*oiS*UJ7~RD;V2`Im-)1{j9I=SZ#$vK+3NU8$W1yUBt@JY=UW4Q8o^ zVbngrfg6*IDAQ!%-d8DPDa5pGOITOs4teScB%j}gz$;a>r*=!SF9uaNo|BD>@YRAq zPa;)^cnA#)<7Je`$yR#T5_tPW#bTloS;yBR)&Me(-rx4{#xW;FM`5q06~Wg3#e5%4 z&|E-*1#aK z#yQtGtr=hYT={;L82|=-JE*K%lG3vi?Org4VSATaInP_I^nP`bl`-NvnrPM;+_BDv z#ClBa+UssUR*$O0SriK*Dw^+CVT^XmN0w5LqoEEI$j(?~cwAqaWry8a9kJFwHC8>` zF^beTceI{l)Sq9uY|Lh;{k|_CzWNcwaq-DUzwGTPf=~4OHrzUh|_i+pH((ir8pR61jqxZ=1p;J3AaTPGI zL0+cEw<%aw4@X?&V^&g0$3{Cri|F1PD)wt)k2V+~5{X-v*{9(uKqdT$hu;Vkwp*?}?21y!@(_eB=UIG#Uq6l^HU4WxCkHl z9!g-WIsB&Ij72QFu=vy8LdRc(MZ@Fx_5&2kObgqy$OfdIS`cyJGpB-DwNF+P?uqid zj0kN!6c=Vd__{ITma1I9Q+op{!8kh4mcqb0^)jQ)`Q-(zq$hc;z*~<>L1Md}^yu}D z=DP3)^|;8koIu@^vivqHC{HKtd~<6cvH|;s@UhjXz&Ct2T&(tatTMt11#)3ky-Xy% z3o;1neYKv$v&n!7!`?pFB}#`o7E<#}%aN&D+JK!Yt*jntIKD01Z>3Y42{&KZ`LA=s z3U);p^pDxB1^+X)4wy#in+Q!|zf0ndW#K2xM7seV45{cQ#xIe;)E)} zdf2vKe6wtJ7S$vLkS*^d?#=dh7`1AoAK2S=s3-bCmc&|S-2_Ia>pXciRcUq8`uihS z$Nk;n_dJ~PeSDPBd|G4+nhJ7~*}>vZB}MxM^R^`zbEh+zyRPilLR^zt{uaCte8|EL zVPmIs2fKtGbAuWg6QNF4m>9=Pg-|=5#YVcWR?;r4AA%cGm-%&j5LSfE_?!qG9G1!F@)Dd9&h$( zNq35k5RE747!Q_>21>X}p{+6`&g*4el*p&U@nM2Lj}WkmblJTQ6COp$JV;3IFy!mt z=3!`&mk8S3=QFIpjdTSAK8D=u2oIX&`GO9M$YzN5?EYIg5*K2I*KO4&X`SK^JZf;JaBg787%^f{{ z4iBzVdlShz-AFW+k`^qFMcRL$1y+q-IJvwCGXF6x8iZL zxQ}=8uR6|d?@v;*kCT0uoV2kqa(EYA!wOh#(6q5K_`Fyn03U>)Wct`S#TnVfytJ`6 z*}mq0WIBe?qcKeh7tkO^}= ztB=czp>KTr2Q*d%&V6z@*`p7^rY9*h$e)>nYg#VPuZN8z`mi^)aV4cc{BvWRuaFdh ztdvN7n4RDGKjpmlqFuL6%-4c7Rb9;;J#Gs1rEvmY%vS+xC>09w;%Q9`fyn`*-1jxXN4N%-jdgS55DGj=vN4bHVqQewU99K(IQb z1AsDkx!BP+dL+sQfh4A${SW}HmfgX@CX%v&T=T>Z!Oh_r@tGXy^NzhF3f zbx|-$_4O#;!TvQB5Ue4~~;Qe!bI6CH$_^^x{wOdFZ0@FnX zhR~D357kI_A&u3if@1VYWA#1NvA4SP&+|=pN7#qP*>`?E(fn^PpRqUi3N(i`j5vGw z8C*U=Xba)JY{ahWHiBt2RUNM8i_B}SJGPzaawvN|&FCCWyf4zXTy6fI&ws>-Nj9?0 zL%qH4A5r;M#jvJ#H!Av^Ypd*?#Ny(Ba(Nc|*ly+=uA$-zHaq_m>kt0`|4){?bUr2o$(oukSBAEW!90(4qCja#CQy<|qI1x`>&xxb zcgt(7EgUb+o7QqxGSH0Gj8FLt&zDit8V;13RzFoVt1R56MY=*(mo(WuQ>`qW+p9uL z9qY^59k&|4pcDo=Fsq@a(azfA@&8EmS718$ho$gVXpc8E`qlXH>t#0f|o7~ZT?~eg`7J9C;-mfQT z1n92km^+5BFuEGm?`VOIk1lDtkJ>kITkAIkKu;8hbXwVc9L2I|bBg4FC??|f^;LA# zxh|JT^5%2`)FX@P(>VPZ^3jVaLER$jWb}`hNoc`X^6c@r1<))(*4DO83AAK*?|t3B zQ8n3TByFy7Gq+G{foma_R$J@ITrtXjk;sphn7V?Nq^-^<+9CmGtpg7yraQ}AiRe>D zyY2P~Tg;KOv%OBs!BCX{h%&{I>4$b9Jc}VC z-_C~v_db0xIV*7yK4wj|EfXG#=a3|(d1$bDqK8?IJ6X|q9E8Zy%4+SWq1p^k92Vw4 z&uoiIsDC71NYn!W-{1|IYp!i|SLZ}Df8XB5Bk#VTxHjmg zc&V1Rv?_p&As(sp28N&X@K{Uer*jxj(GRAS1-Fc)1CT~|<=aEEQ=j)|JmK&6Pc&l? z;^AAL44PCSGJzMBBlA{LH~MuDJqVZk3NZCVH7qbOUQbbms`(=wSF znyGV-{S)RfYw0hFWG_+nRWdrft7&pCTN8@6;k0+kif)X5lB4d0r$hQ02)@ABVUDNw z0pU0`9d_f~a5OUqQbu5bk!HCzOP0XKjMXqNluTY%lRuCPF*GQJU=;SHU-3 zhxkh;`DF~RS~s&U)PR$H0x(+bG%B&>d|v+%aVc`Eqh@M6eFrzTny>p;@pW{5u=#R7 z(^Yo13zCZzto%o~vhf7O=A*ijGkTK+KyZk~+wsH|LJ%F07saL9%5=#rvZ7VN_P0@1 zZn8kMaa||m9UCV~=(fROh{P9xu7#svCBjCJNu+>|v7Rvg?k|~f4ESIg6K*J1F`q> ze))N_1Dr>+C3hi?)BU;7GAHQ={_pm$u_A%BS%U{KpmY-DU}<47P=HK40XrviItv>l zqO2i=f4U{6IbKoq9s%Ly5O~^T^%KQB-n3gEITeC80f3oWvdIC)mJ@hYZLhJ z>k$PZGX!-0b~5FUw7@+z2Yxqlwzv?CuPc~De12#7%;9ykndK60NmE!XiUlM9@h*OY z{?Ksr#df7{Sn+TRVOvzKnTzT88AKCEIDpky8)+1;42%RsFpdD+P3!7VLx{1kYn(Kg zZv%5u?nuQz0R&LmQu?}5G;a?WJ4Kd1d%r)bw`p!H>=DoM-W5Bq01!I_$mUyHIu`hQ zv9m$%XxLF4AMIZr0Mjgk{UYqUE(THN6P{Ie9K&D-*n?9{`5CWZt`x!0(q^bpIhnq4=3rW3q|sn?Wi_IZJ(SQ?!2m7CGVfl# zhweVAeg3H)Y`^M7zv5*?qFa(*tHPLgMA-p9v!@3#HzWmHu{gGa(hvV5a9oE=lH)aX zQT#&l9hFQJ@z0{u9{K*SBRR&{eHYrV%uC(efxPII#{|#GG@S`&phPA^0@pVGz^q`& zBZ z8_*>Zs(xeHSkD+)X)r1qnsy);ZfeFc$9C6nBxx??zy zv|!v?p3VX2Wsj&~GcUnHc2|jxfkVfq1++4U59h|2!RBXPlKV=*gGX64# zF2G8D^2@4lkCxD7{?-d*Qao(}9>o~>nPkWjk__-3#6}>233PekfmM6KrLEdzmmaux znBMq{k4T4avdjulg%y-U**4qt0sOI_MUTXZ92XWpG zahJf_NE5+9AeeumP3K79lQvo~&FQsVH-w{mf3Nnx8SM7@0s5=G*`&A1fv>$*qINU? zW`#*sIwvs!2Qum^DCrzr!Hp=H&`|ddznPJk-0l#brs@A)`g%a6Hoyz5nreKv-Kfh8 zJsuA+d!+H?+fq9Wu;`Or+hZ}WuX}-cMX=Jkr>V>{!@f6ZZk@DfR0!)=R zD&o}d$(THDSv;W>%J(>n?f+S+a<~BlI<@T1mG;ZLTl^_zL64)r za-@(tXcr+{x^TX*2yziB!@5{oOyo9F*;QiNseKyb`V+V!T z{rzo0aX@SxWd*PrIw5JJ2FI&yyS-LNRjga*ToVQDR5vc=MQ{H6m1P}i4jk8%do3O5q?><&TSujT&pn!VLm&Q zKNe@f_BJEb*ze=(yp~;Iribe8SQLvC7IK7Kyy+ssn~@2B36wk(->>bSsMzOS0Y9eL zu~UfB{MDI3CR-1NreL5#4K4Ddb+A$Q;BvT@rTe7R-6+xYDiP9R07HJZ@HD9pC`yVk z{Z&0K#oCuL7O+y7d2?MGTJRxEpL%FFJ`*D-Fju2+l*1FnFF zdL9Wx8K6Ig&M98)ScttCA}s&k7~9iq8z4>M|v&GC}|9R&t zCcr9YOB8(*=ZCdjPj@D1^@h9)vU2r85{ed#wKL_=X?p zld;9@P9ZpU`l%{xB}cj#VNVD^wRT1OeV1x3{omh>a7@5^T49MvLlHcvf5tn%ZE@NL zR+vyA#n9eA%C-&|{|0v6lmpFO3n1>f%V&9pN4#Y58;dHSu@iGO`kX3X%5r7}y zg-&i+iXi7&kiBEF%(efcqG6VXgoUC5RE@d7j(;ku>Eakn4!Yh>&k{*cY#j{mkoP7D zwf_%>XAizt98{s@U`9;YEsszyXBu-CL&Ez6Hq{sP^OJMOzG|x+>TOk=Ok(1h4b|qxj*^Ts+qs3H>;8MD z$sUr){9Yc3MA#$@_@rLwT#Q8Yx=x1+`HhB3xSvyEksJLx?3!aii&3m#vXAZ zIp6q3DiUikDl&vM2}YbCVN$cbE(J5@0Hq_FLqUrNaH!5TNxUK9(qxsiQR zg;>z6^i9YXH;WKwi69`2by1hVDJYNsTRNY6aW}sJRzrW748SbbCCoWvB7$?Kf?-hb zpnu2$3#T1}eD`6WuDREZRtl}qLT`X$2LHN?h&kY1awVzN}~z z(=~!c&h}NvD+GfdiSpPL7+c#^$5j>@L=iqGt{oypy`#g_oVIz0I3|(z5t2oED?1CH0svOG=2{u!ImM6`YyqIabGG`@ z75fENa(z|4?S-6b?U6EsE{5Wmf_~Ks#~hS-cDp4|P2~JivZDH4U%4591CDJ?I{AjH z#Eu;ib$8ii_Ha3P`T1HDW9%-eB~bioMzBrYO-8Y(TJKr%xwtXR9>OqB zvp5_|&x#!}p?UQF3rJI-KV9cJkMhvGvv^@Fa*z3S+zuG zr#E#E{XXI+FI{)#+bAI~ldmYz2`YJnEm(d(;eRJftJhd5x#R!bhq}( zE-E=vuN;W{ybtCtoZY^-hBHC$$($Gs_-7yZAAgtw3lju`8kJ;zQ3D;vi0tK-E-Mp0N7> zB1iA^qUb6>%&E($jWM6`=G|pf+Jwq1!YB5OWf?(9upi|Uo;QjP%|?se;Qj`-$uR5O z4+v;9y>ApaOhWfYziZT^S)L;8m81XXX+ApaBhgB$Qgv1)5*d0Xaw+g|KRMuY_+b9I`6b^E1NH8ztDFs zQu;v8`VO$0B%UHoUNS5nrEmX?o=PnCUUC9ZRK=%@6%*5AW7G_r3P|h=hM6n^^10QO7jLC|?WD(&suZQj0O14bX(sX!?Yqn+l{Si9xRHyA0Swy(#y-=H?Drl_gH*D{VNzY;6B7ndSNJl$Pb z2vYDtL?m5GfdTzXaYhN$O-yHJbtyIhv6eDXx+{{tPm9B%F!2U*ldC}sAvab1Pq#*o zBYW(i&c19kYt0JSjdG2Jg*T%IQ~pBq8^%LfeOQ&u>)tgZ4-A2{KSJ8Tau3?CA=m)f z)$Z175U%l42cn*^J?Bbw67u747e8iCU#@c2yFD@g7zhX?^Tr}8B~MFm_Z`HUTFgX7 z?t3@M zJ)H5hdZbWTAS(9N1~K>C@3;FR3(pp7=sXXqo6nn0kmyKKVxe-`$*nJ&aR#pKJoKyR z#vqY2t0V*$T6i5IE0Y>`r?txRjh2y7zf{RhezVCi@;V6+zMltxTLc_310ubPN<6qz zD4H`q78ClKQrySJ0V)7*(EH0VGrq5(<&=mNyo?HtrE4b&&o9>Q9fU>sgsSX%;h zK+8jt_PpzH*!Wd>qSPI!D~>(Cd5G%Xf&<(sS|?Hc627#QT#kI2QubXqVhZ9hZ7=PI z0~`VH1iyO;N(>6J{DGmG)vis#6CpsPDrw-@DPndNL68U~61nOXG){i!{n4y`1fYqN zmm_HrsJYPi>vQ;1#c#Af`DaNfhJPzJf&_l4?@8d+PPHUD+F#~)ipMK7dh03iftyBtKr7fHa zS0iSp&GSNT=QC5Jxbj`fk^0*ppr*S(If?Vz5MwdMm$5a(%%kfeUK;rL4I$8IWJ2{o z8FY$%YeJg0plnMZprGN{IUPJ=_5B$txyvt`4=In-kNN}*6$OOt+3~m?5!DD2{hS0V zyVYl+_!s}z(Jt8{?{w4aNNyt)ELv0wSn`tspNU=sCUxCSAEsk3Qu~B%u3;6tAC-*dKY@QF+Dj#=4xd&TOcwp~_g(-}d)hzJve zM!`#Hhp4$DZ_*e16l&SjOF zYihLEDKCvXp+>QBs-1YXM2~o_tZun=(lpx8@K#4&7M9Qc>F884q4`-U+mwapsIPj` zlKoX0*Hm^>#ML?bEO76lj5VfD$3Zn6#!z5^QKFYTUiDU6>5LVY!uzR~Z1-B+Le1MA zgw$%f?0jlSJhK0*OKgQqn_FotU!H=ZehI>-{-#rQvcI0w)azanK?U&Z{x5}4G^e>y z3E$WOA=>uNfn(EP%53<+88_0$(&^dtu3}KKGA!6eJHH_HO@-A! zBgrDekYZZa%o8q6rP_#Sku-5xLg+_D(weAxDamp(CwXc?sbI7IotQxM-v>8r2TQ z(K)PNx@Rsbl#RLvY!pt+@Rj%H`xtf{*ME7ZqhKUoI;CifMXD*Y?|)-Y-_0>N4TU`# zQL0sEqVp{jA-0*XBN&RuC~F!(4wkA@WJWhL+8QZEO5!)hluAc*rP-rRc1XTc3(_nW zzs$eJ&lw0-skb7sRXN#kO#0dlTE;&ZLiK_g3h=KQJ@HN(O+|=(5v|S{$SS`TCih+! zU8Ui6bvgmHSf7?2C9bp~5JbJ-@fdaih0DO$Pz(t;l)_cII98Ky>R>$lSkU@5O=uHd|Aop#TQw}#9GCd^9`aG%LoiI<_2kB zV5iwBp|wiW?W`)fSwVH(QPmYTLceXp{}mc`9IuDJfjHc(Cr85*q9N{f+qZ$58+y+~ zXXo7WK2jKx9*e(jc4w+l9liOiQj1>MX7@JmX6UWia%WmSS-m8K0H1GWU{!O*zmE>} zwZ*9OI@T55fEyOs9QY0PJA4{7TZlfw%v!hARN`Gw1j^hOk(wJ9A}b@^I&v7J_{JE| zch-b@p!+xE1j#}88cb*ng&hRt7h@PA4~$r19ahQ>&uJXAxCXL;7n0|7$zG^TA^iSX zfE)MYH_U8FuKJ3;`p;d*L-j>qAYRYCKP|&vY4_<4&;u9^c2{eKHy`AHLjAM#mT7U0 zY`!U1>DnU9y)Oin7chQLP=c@v@^-*+1vhZ`;mjVlZTgpD>SzJLZse5sLjz|15$X7- zz0AmS?2C&dCVW3do4N=c?9}Y+h@7#P&P76VXcUp&6`nW{M+&JUD-22a^h7?HzZsH5 zoQ3+@0mx8pweiw;A`Yw7D}us+iH~54M};ju3>@WnOC))F1G>Y43#!m1g>cq>*O>zA zBD=>fz(B_YC=7?0b7PPfH2>P(?>$*97~EY^B7Q z_z(ng!#X{0CM?)iB0$>ofm!@g7JTTs)C<3pi-we5m8xsqUeQ>Y7i!rhs6BUi6ts=s zJP_nWi){0G^&pxkCg*LBVw7r+887cwiV{1C^;Pwtikjeln;?8@2=&!ED(I2)z_$)7 z*hufBFO28e@#|i9qA<95_doRAxQOJ)q&aN0!lFzKJ+yG{chO>=hO=m|c8mJ8YSJx( zXKz2X`A|g4df0tUrSQD_pXv;I0I4hFbx}h|L-8*=BR*N)A)-X-;V}wG(6{{H8jJD4 z113r=rny+cVT?&g7EHs23}wUNh(IkV3{;r~^!VbINwSS8cry3^B{q^_qrlfFgcVI9 zNd@Ket^x9fDIQEcC*m6w0++;*MKh7y(MSJ9kKkttAInx0<6q&TT8fIdx=vY`2&<$}y02Gz~S zV#kd81M1&~+xR`p0HunR62X;FVE>q}2$l|kxSFf~2KtA+Z@N>pVw5>=-X_ZQ_+luO z8@Zsa#AHKV5`$3}CL%NI#ftRz{ZXF!G*M8JJDBXoSPsBeJ~#^G0#$dp#^iXQ?qeq8 znSoLs9GVp3gMab($P)5ca|N_vG%Bs``iBu6tFHDgrMKkpD(Z9t}0*;pH z&9dXt0OL%BfJ6B(O(z?3hR;L}{%l zD?w1hc0Ods`|LE=_76c+b4@qwP3V$BNkwa5dU6?k>&VIL6CH@`>xT%7iGIJYn^z?m za^O&Z_;|S5efh>Vsba495b24u$qSN~r*x^An)^l#on9^+D zH z5PppPE`Aq=wgRdRVME5WaTi(o_b!f~vbtvpV()SehX%oQJmeZuMQx0n?*c#~wsS|u?bp|NV*TGLMn{F);0^MYTYrU!Z1zS6r5I9b?*}&@;LJ=njpr2^MYLi*F zJ5Dsr^T^5(xTX_06^yC6WiUbw?+zeR95=u~8Ut*!0stBV^G1}SxGi*}dPEeXS3j57 zP!3|rN5T&*C7YSgKLrbFgnRO`d&!WA#=F943-*reG@8r!;#-WaU0fSzsGs)!jA8yd;!<&M*$4x=Xl^C zU8o_&+Mg2$NovwE3T`emaJz3S zL~_=krqV_cU8`^;_^9p`ao=)QHd1om2x^RBBzjbhVWK?d6QOm^`1%Fm)NDh=*L28) zd6&^@8gsxQ+@*574ZdZya9Sze*cUEa>$WcdeBN?_L9v7KjQz~Cqv^eTxEuPx$}Vb1 z%3-?99t|$!GcocQVdgE$v}Fc3@%GS@fD1=N`TFGO+7(Kmt8lbqhJ;Gp z)!CZk!VWw7(-yMP#_{k|s02ozpHt@5IlxVDpAg|4|7@h0RkI;lEM$tKMAc-nOmwtg z)HHFm?hHny(#Rkz86>a+D|ow(3Bo_Nc(=PuaFc zq0F_4y1)`3)gj2_2B8HDwg)mga&5bjxF&hLUGO?r9*&?cY$Coas?c5b(7Ri4uz?|d z046)cN=@?$)TgTIoeTYnV8=Qr;OW+Yu#sN|r8$bX0P+%Csz8ghp_=8=IE&eD%8+Cc zz!4%U@z1a7K>>49w_jB!M`$s$z`su-^VRQ0H9oZY}_fw2j#D z(96yNHrA^Xpc12zTMdQU*s7LDIJLXKPF!IO5J=WDXj&+umfZ1z?z*I{8HJlywnXS) zJIaWpww~&w{L)(L89x%!q`2-& zmA)AP9xYNYPOp`1v(-tZZ~&@gOHZ+ZeR$bjb_l=JmEZ1~vzU}WY%Q9Vggw`8Z162agRNb=GM~vt7f7i3WC=)_~P)Ag~9Q-2SHXs1`_{bSumT9!piW z#QTKT0d<6Tw@+u?J#)LpF|v!j$-0zzH87rO<>aeJlzz#|(AQa|+1S$v3D}6XN$}S- zYJt^dg3M^-R>CY>kYK-Ft80^qn#dS3>dm#kkbN!ZJ(3yWR&}k_;^f@*CqBkvGA+Ej zqD@w&B!5dM+rf~wc^y<4Eo?f)w1+Mo?9l)15Ex;7-=J(cbf5?~Xu%08fR;P~XPB_* zWV>YDY3{tyaw!m)?i*JGK~~NE+j~CZMX`I3J`=$=h`-s;HNx#S-(}!^r!r@$y=_(- zWR!Y0l9a&2TW!s8r7w8?EB)WV!LTE#O|-kHaJHDdCH=&uO>NSyT;@8@uE>YbV0k&4^&dgOl6Ky0|;GmLlLFVTL=#8pN}KXhy1Y(*tXquY3-{tX;}5>CUtz!Qxu>S z^X1-#dEL**@UFgO=iN@LdN_+}s8P%{< zpf_6Dju{DZ&P|<6KjQ;Hn2bO51QOq^H1`*j1r`?do9%t-lqm!$VYK2!jF{Za?R>bI5^~IBbb(^w%Y4Qr30y|b z#g`75mTkK9+`g8{ceVD>28|#e-xi$ffJ`ckxX+P>j@c5WKwxlVDl<-%F-ap$@L)|dLB(a^ zlgJHs+Msmfc?2ic0_Mwb6sqjem9Qx>SkuZAfUR9s?8_Gk1)?-mB-Cv)7^1*z&*wlD z6b_MvnQM@>iAfXiy7iNmzA}qUgLWlJR_k<=~fY_G8vcOjaI0C92eYJbMhxS^P<@$d|P5o{sx$#0pQz4H%xh+WP#`!Lysy3Uf#Y&bU?wr-5fqEYeS|!lhxfRHz0NPOXiS;Cq5sZrmQnLy{z&hTjxV2|* zk5QuRr_fp8`t?DP2%I!`OX~css7eArScAkG$#sex0hhdu@s9n${){c0h*A;PsUt!* zGzWF@IiTu5o#?)ED3HC?GL_9gL~BdlV+qC3CozWRBE-3l{$MBPBvuFTTJ zj=`zXqHak`K7b%^-68MW+x)0Yldd0py={^Tr^A4{uG0F_N!)FqN1+v)fSCdGRNxga z?;HRBz54P$)l@o~&^TF{I2)P&|ER&Fk>yr20098F{a1y_`2VSDHnRJ_=et=r+nP8z znK=CiGPOm`#%_xh;m7(HN-z(n-=W?oS*c5iGas|nKztieNCBnUxe-#TSX9v!maVVs z*Qn20Op&hmXnJP;M5=gcXQ=DYiOy7nqL}nU9f%_#FWFF1sn!p;?eUNQ9>d9j71)j+vNROU_7UjVuQtG!FxKe31%8w+>x@vG*E8hP{D#6 zkAR_$X8kIZQUx`Bwi!!*yG-dJ3h7HOQ*A$kSWqzE4=b)(0(*Z>d+N}cTav&CCzGuT zxx2fB8&v~s+!sBQq+rHK1w|PTSR<{B-`Z&<$-f#@2f`l+j50cq-E9x5;ZumdwkN)g zTe6$!+w0?b3!tb zq@|tpOU(}E5Ls5VuziWdig9K);qJ^{D_ecKFi93>%b6wK=Au6*kAJ)xTnP&X|9Lzn zPc@z$PCCOod5tr`7#HtLK6fc6Mj0o6xuz@}(vr71W6&+I({V!|_&$1QPO7q1nDyJDRD5RNnPW^>leV`|zVkGSXt}x{811tyMbg$wc z$!U7AGZx6=F=hT-W!MqVSXXWN_v#?N6*oXv)e6v(PEw2(>|9$qpeCWdOHUQP=j>#{nJ8~tTP4M^`8@l5eBUEITrhMb z%ou0bQXq6p>NJmBY2TD|;Lq4>U=&o989Q9SipRJE@KeiwDhW3!I+=iKJ9#r$&WgJq znG-5$pcrXSg(<9bNTUO|3F|0{=EE-D_hX><{J!fxtQUq0?f9mF&w1_{+#1%Z&L?8@ z3|Lt9HI}B7W`*+1%^!acJOYS7t`-s#HCwmdS9NE@j#gk2=r zL3x9IV<5*J;;S>q@qz)T6G_~6#cA_uJU!t=pP=pb@Rl!4V!_0_8}X<4<=X^3nP(Z@ zk{{Dudk5$vyf0>7-TkhJ#xfG>j-F2oM{kZbe`*F2L^$0fcFwI?!-eWR0<)7k$@6k%` z;O6OXl_s*?Ot0ZOqi8$VNM`T9e4}R?J{K6_i}fST0{pJ`KP?)0;W_DOhyVbmd;kFS z|Mg>L;N;|DV`BUtp0XV+E62l8#2=a*!$>~XWLQCst*lCUZO+Ex8OoPhdx?grPa_eSlZB5atC^pH1qhpEZ|9N+6Nae73UX6P5R2MjljLB{U`izk@8rq^S|mZ+v0S!OSG?oF(sW^>Sxs8P9FdDUW8|*FaGj6VgF(aEjIf zK?j~FLz3FZa&k7~7a&86#*S&ah0E^+w*$eE^A@`ddtP7`WGt+O-XQgpMgUZ-uDG;b zcG}?12lGR-V>!woYi?t|FHlLU8A4pKKLIsFun1fh!B-EvOSJlWDqJk~d~FrVQX zlayKQ@HVY~YgKlvr$CzF_pEz813 zr4=dRz~z$F;$`l!#z-=Kn#2auO1*M%wvpNgYZHazXd~tEA&t=Z)5`W4B?^k`p>+iw zaF{0zr3L(2RJXgO=f@N?MLZ77bCD)H`*#kZqpN>E(cRg@m3qcg%yPA9AqvYj$}Al| zB4DRIEuY7n!(hnxexD|PrN3VHei8NU3xl{P^^+tA-MdDp)he6$zl=K@oq$QtDhDAr$(pERQR)lD zmoSDRpt1Y_g@cdq9{u-m)4QYr3OPT}6&BTdbDJ$2^F>g$TkU_k6@!>|3ywd#PSu)1_0vL3q_;7Pk_iXH3_63FD9wITSU_iNgZ#2JWnTJa&T*?CY>un4dHA(JqfDvu)Has2ZI zR6qh=wx0gWtc7T70_gHD$r$j_R+sb|`o2O%T`^}UJFGh|qvpc*DNut*U#LwO@t~d1 zT0L>8%xg?%8S;FCaoJ^*T?894vOWKmI&e^+NPzyZ3H;p7V4l~y*<{RM0%7;vJL^BEfXgpq&5!lTj4sZk_tm8p#&2 zfWs19&X*6CTipw{`-f^vr_>L&ndU-h7s(sBr)}O+n>XMV@m^x%78+8ys4r>X?5B!3C z;ss`mWM&OP}zae7@V+b>$$}9GWzNPB&nLy<^X@J>_NB-q>uz?DEKHfu(GrKC8q#45SYXCYSn*)QJ))9@ zxxAR-BkH}3UF(pDO`!uPmpktbCUNosMDJFcyMlly$ zqCW}(a7Ej!A9B_QzPdEcF zY8=`WJjg9QB>FbV^G`5kmM!OvP=#J-Mtt*&h9jxU)DOZ= zWrspC2m{NZECOAq1gv1s{X2n!&&9Oo30zTTM-)OiR|FBw85 z`nR!|I5xwTOB9^7;u70%It1CJoo5QsRrmxztWPtF<(S4F2vPo7dqi1>IaB%JwaFW- z2kVSBoYiOO9 z)N`MPvN2LOn28VvP?E?;#qy-hMvCK-`PlXR?jY36$Vwqk!6r(R^uS?r5d(500^mrN zo1X}JSX3GH-gzw5?#I6oJTNwqH8|9B5+gCpq{zG%fwx|cAY z!N`I1NU;d7>hK?EuVBlM0I)+niT%A%Tg4s5SaVaYb0cM6uh3sKJIq9YVeE{_m=x$@ zH{knci%exei02aU_Y{qJ#EVRE-wezuhR`UACoK6{(O2+Tu~dTPSz#cP8G#38Z&q=z zT!gYqS01=m6ea{@Ndp3?cPw#Hp$HoTVQ^$rxWq$NMsmlDvL@{gKyultc9kQc%-4|C zF8yMv0u1bT+VC?|1FQPP5K_|zAYmqVn6!=(9y;j#!x-yr5vyg@-%?*J za~TC$I;C9{vCdWx;Hrae_uz0}LlimYYoDL%c3ZJQ5Yp0nXL0SQbgJo)wTRr__NLob zh&T(3?6u-mvr;?`@Ef`2F?Y9!s)yqLR3A3RXvMCK!DTngKo{2V4O95pN@*Xsj$Bn> zZqn6PJuC7^V3dbk>M!iNHYbw24&iA> z1IF$o321-Z8Q%oM+|(Njp6>QKE(k6ec~^G})2SKVQgCNw&=0Q8zOL|niaQa3zzfnI zqnJl~MZb!+3bc^(4B}o+n4(==Gs*2o*IzR65%lk)sjB(vUW^Pk#R5afW;c(XO?w>7 zk%C>c3Rgd_yzN65wnvBCMoy^@GH>+Ejp0i^6Hd-F5gF1QQzDmRt&mV3teKI^avmRg z&ur~%GLjN5Vh?G%xCv%-dHg;9;*iXLa_$7^SZlOgMTreg#JclXE0EShR+AxCoiY#c3!m=4I`u4L;_7!@r$}^dVkSUHMxvBf$bpJJrVuC;33yZ~E zco*kzCWG4 z>}Whppu8mlCKjz~1a?}jsfB}txm}eom+fo|*6XD(cX;kgv23HUcf|Q;=|-1PKFBH9 zUY4?xK>B;-Xj6M#mDh{a80PFuvPeW8^?95IB4%-UK1Gp>F^Cj2OL(0NN?x4hkeUJYx2 zbdQw@lQQ}v@m*a-yaPA-^1abP+(=d3s+`s#*kw|uH{vYHs572ecWr4C&xf^eCS7qe zPN8+QV_1kA_FT6r&0K9@%yJ(W?o!~xtt-{<0!&Mb@VxZU9RAdtZ`!6e^sqQ=<5gWu zX4|TY!b=~ZX%a7ttE$E7b-LXS^F+O>M_Xh*tv)@NfGK#vLl}iuFAItqNNu6Qx(ox@VOlkg(FmD zuD8A=F-S}nII{o*=K`0|+qsJDHo?^i&uh^wF>IXjp`<<0gP7uOj_~*M2}ruSN`@kf zyuI1#K)4f+1i8xXEf?dl;B_6B>ExiSA&bL$zG<&4wg)Zhh*6?0$zW~8e@HU2Pd#u> z6*=*kLWg6h!(#Hc;wgcaQYK@Js^C~rN!nD3&?W&w=5AGaGS8TjV*=yMhigqsdIb?( z88avvnRE0ehDs=3Tt#K9MLUv^Wdy%;I5(2@*-#eU!IlT!0x3R+liN>Yv0`J0TuI;& z3@{?xIu6>HcZEhREQb7Vr%SP9ZDzngnDDI1#$%DzszXXHpr*hCD~b^0f{8xa@wSb0{tdFq_} zlmJ#`VkT@;%i3XmfophM7Q0lWwD+-nrB_8N$sTt>0ltr#25ah@LIkuL=ELNS2I~r1 zr*v^cngUK;HNFgT?Tb3Q?>%wB86f2{~hC8m-%Jnyx8&=8Y zoMtx|QY~R;ZlX4k5#j~O-Z^j~1pOo}ZZ8!6T!o!$Q(xWw7sEQIkUaY~%%dww$8S=B(*Mp$g~2Ikdi z`-*`PITWr4(IJ1kZ~aYa?RquQB4xd-vzOdoVX6C`b!4C0A#222{JRNJ&siL;%aO1A|5hRB&PMO#Q_?(k^E{54_8KS4`zoNZEo!RdRQ~_+w{c*v@Px zNm>B?m7yg)6j>CCtcqA0l)pH2t@b%HBs)5*pt-(Pax9VTPrtGdO@Q$&g>Jd3DHlTi z;Wbi6O3)5^m!dPR-0Z09UM`<^v7hy`l3yfEf1IotcEJ}x^m!+K4)o^7wjSo}+^e>B z#tmksw2G5f|5SAYxKU@bF})Ubt>rgyI^DVRHwP`H4GYNlieCi@+;lT?6&)pg4WtId ztIOk?;I9=GtW3q;e=Ik}h;uPRfI`ZRFBrfMy6IT5XeKTr*~^7@vQgLQ*dmjMh@K5O zSShaGVL~WlRK<-B;`RW4 zmhBcj!dI(o!;6@HN90cax8p@I=;B;{h?jq8sw%5NBynmozP)$uZV}m~B0L`wIt3I) zXz}sv>@19l0j$TJR#bfu-K@lE$V=Q=cDfOe(o^%dZL)M*eOR_MV9y*mgbV4)^XB|w zOm#O}qZ{@FmKFG-ij86Eo&Q_PxI7RF6ny#c%fdI6zR*n=TkuAK1-s7qmt0UHR@Av(QS46*my>hJgE$@d*twiqD+wK4XSIZHni?cROhDi@5S8Rw6wM6*0Ys&QwY^9rt>OJx1IB9ld{vAO-m_8k%9q zml;jdWTHGNO#9{?P^~gvGQ-p&={}73+>_+B2lX!yT+4?bZLy(B@T7&w5h@>{R!%MTx^5^H8K6-^Ds*@*yc&o@}6J znsAQkWh%a(g*8qe6bBPT>jR?A>KGX7wRWb?astQG7Q1s6d;bcm^Ka(ci#rbZoTOno zlTD&j;@!haxoyuOf(yXx4|t)=FC132pmk}>w%w4Jqfv#@qDcmo zYCC5xbdieP8mB6qD0Fp|jETG?hPfvP&5@M%tcmEoxo@4+h6KkGotiaOH(g69;a+z2 z?lf67AaX<$Yf=dyDb{ZKFFx6CPf64dNgKC>wb?8Tt*aXLLLLew4el9g$1P0vj5Ut* zsETuVygrh0H@EmnUQsoY4?kZA0uyOacY-1`$EzuXetsx|>oZYJ+?r5a zkK4TR*R+N+({)0bs3N3=+qje>9kXq*;je|=V0GR-*%6ImH(Cr~fb2!jt^z&blIlY= zfs_aCI)k`|4KcZm!lW$-_al`69-J6(yzPwYG=vc?MN{N8_HPTtxQ4eAz6q)HEBG3e zY6~X2T3!UTS{_JOlryIqAGQi1$}}J}P#O!2ouwjAy861xs)Pm29}wW<9%Mliu8_Tm zjyXG)RtJvEjQQ^qWqlxK)KDd4^Z3c>m%J!$@Xcpw@qrN@=ts9>yu3_ zcQmS%&S>Zy)B3SOfmLQCOOp@Q#d|Tc-?{Xo&i3NFuv&0;7>mY)2zhno1{L>C)U8qt zU7pej#3L<#X#?)3c}&!yu>G;ZY!T?Uv6K~)fFGCG;*0ejn(7e8r#pwE|3EN@0sIjL z2M4#O#f?ScEX>Mu@55+}az}I3io<-y=P6VIK%FUkD@>o07==!#W*P{i06ii|H)_@l zP*+~yo$$xw!JS?6&@K^?tsb>zE4`|Z&wImOtREDd6H752{g&{`td`R|5zlG3@|5IB2$b+UXBbJ$&}1I1cVqgSe8!e%8oK9Eb{NBmM@)Y zT|IVocbYU$Q|uvI!PKoNUZ05Z-o3-#0DT`zu8`f8z^k|O`Zy(QzsHe~hh=h)2>eE$ zE7S_FHben+V1d`+JSb}rhBcTvK=r(7Q685n(qitXsLUWX`shoF-^bA3eO}Poa+XiK z_XS`6J~U42pML}|0j!&x3QR$UBsuwH!aMT;+>MvfOl^LuK*XOxhG<~6Dief>OK#G) zMzxCN&fr8MP}sYdy@LzO>Q&fgOq~ILeWm_77vBVQc3?aCJp0D$$s1-;vfY5?+AXC0BwK<8e~J%ZMNUg z4#l%jk}KAbRU|M(i>zlW0&$G0RUq(_d#9xpYgE;6+_)|kGmO1`Pf8OsnK@a20yp4s|(_dm=S{|rg+ z1~92&z$GQHNg*w7lm*WGMpsz&G0ZiQ=tq#VsnyQQfb@c~dxAhZ5-$8K-G?NF3 z%TO{VL;2SO&79pAP~0i-$`{3* z#H)(Q@%qy?nK%Vbk?hhnZkg&LDg~F_2u5X;5p0U(W%j(~_(fAHjYM5>n+bV>iWnFaY6#(TFkp6;Fm~*w7XFcXl?XaeFSEXKqik{lcDS~gz23Z=84QnywrLl_)YkV68ihmPnJ7zlMUT6ZCbi49p8sPN1X`NG7{?gD0-*$N7o{xwr4O`T6^l`{ zbcny(>-{)Y&XTKZyR3g;^dYKpvg5HO(aZVsZWeZQlcapSi374)xdr#CJM}}}m_mNs zqgGxS@T~obfAqsiSyaL=pFGEH#8YaGn-}A(%FD@TwXe$;I}1P8%b91cX;(Q%(6kr7 zAf%1w2iL_)U++^$8=J68wGPkYOBm;80*2I2wAx*1yL z%1TL3zg&-v{LgwB(Gm(wW-bpdE<+1LNaUFjmq5#>hrOM(r&#J+L2e(>Wxc)e>o=L@V#l4s0 zeZ$H-NL_tke^FO(jBfHO2Ilf-F-a_)Jb&A&T2V0p4ofL5%YbqYIz$73Rm}YML zYSPLu><)G>qq%{ujwZY4l92p0?c}RkQHXLvLUq^f@CP?T>@#LA2tH7K@6582>R3p4~;#+mu-h`s*2Yw=09%@OQlv>f%ljeDmO9=Ws(3@lBG}K?y*6h6u;HnsjshEP?g+Ch2;n)xYgfD=T zvg{51mThUVcxKyVzG)sucQ&^fW6~>@xuT+>p~5CUP;gZ8&4*^@ zyYL$2vDR4S4yG!KT&`Uwsyt)}WX5BUu`W3*!2hEN%q0q*n9kgCK;P0UtqI6Clta## z*^bZMzc|%14v$QW-sCD4zF+Ta|LP{{Fqm&aqiJ|F;G=lZo7NycysglJ;$o+F_)E<*l5r>jh#qJxmw6ta zs=Sq0CX363OfdtlLWDO#6cP@?4qz@(WM2xu;CANqr0_xfeSNd@mtWxrSxPSxQw+qu zt*z^ItIuu2S~t0+vhGxLr(8`$H>*mMW~H6lwDJ+XNGd6=@qE=pL05Te=&=yT#WPF8 zYBeh(7b7=wErJs);G}@OwC>57vd@=s#ZdECzY+@hM%y^o=Db?tNc3Ar4t?N`aw<$I zCuOVoE5Cj7hktJfa(b<*keQF>fio*(sH$^WrBKu~`#6*rXQh*Mtg}#r1(J($P>w>B zq{Zq2dn(CgWBn%g_!BW*B`0?1CeM6J>S>;qrfgdSfr)7)OX61xIchG%pO` zckRx>=`7mIAmWJoKM{A;R~A%PvYf1}7ZeZ}klO&JyF`Anrp4Foc5)?H@UMKu-wsUO zY3Taij&31@jrCJ-8jayb*Q`A+;x+kdwtWhyXwC0c#y5;?Tia;qnkI{uJr!{Ge<|1h zHf(O#`o;y0T^fiO_rnB2cK1__oGY?zd zbR^CqKCf!UMI4mq9ts1vqTCCk%gN2?kBjbfK?eEi&SANt=`d^KhXReJNHz9Ur~-Pv zwUqP9*pdy%*G}fgir&&VPixM3BeR6ZxjBCr2e{J`gU?~5oRu}L$3^ARF8~816+j@S z9#FOPnEg%Btf^gG{y%kO`fn)J69(FQfloSI4V8s!0K@kjg^oNJbYG77XWLsVn_04S~l&Z!JZaIPO5v4WGr2lqzBKVE%=d zPW&=!mdgE)2?}QKVF!csKjWxWsu0!N#jiJ)^-(G{lw&wqRL14(_QL6JpWYh^?gU! z`G?Q5*timBh^WmpEn{u8lZVy!`wj?wGPVka<5nCnp1SiV1MGQ|Zx{gleJikj+`oH{ z%G<-s>+$}5>2=Og9STuJA}ev$wePLpZ@C@?$Fj-)f*ec3?Ib(%Y4NXQ~+KO+l@i{LQ(`*+e&V z46D9SVyL;&P#Nx5ke zwW{`Uy&e{8cxHgRO6k&)kI9_h(>!8DXx&m@+~;AVj^D|LZnW)+r58U^vnCd<>^c};t$B3R*{g?Y^^w6o>Zo%`Dvgv>mCP|N z@f9EB=7U^%H)f&Ri!z)HY=T!aMvtIT`h-Os{w+u_5SFAwaO_fWruQ9pS!@pyZAcXfzOK zo6#yE^Y@)x-bEFlsH=rl)<%`AGWh2ep#{}P^tUS+x2-FQ|Gwq>4dJ1cx}k=hmZzf} zTGlR+YEg+;R48B_;nT-TP2Fu{>?R%8DcPF?CchMW#%q*fgw2?jofyIi&*80gIl7 zNTN{F-Vxl$tW2GilH5|tlu%W0ibe~9ttTY$=YdLXG8eB<>A=XKbkr{4NPJkAy!^^m z0dWj<6b&l;+gv_PhZ!Qds@f$V^^x7d+iQWSQz=E`QmoS*hY&T!^tm1YZ;iwjD*z!F zvm4k6R@o(4Q@qVE?5M)Y@EnQ3L*{8k8>rAU8w8OVkv&*|?2@X2I`2EWyN}#hxJY^# zl#NeAhzwsUs?7Gh;1hWs4u-mNi2dm(F}Sg3<_jQ!VZWJ(C~u1+gDwvi-e9UTO{LPF zjjH?4MjQ1niEQ}O$n(O|abFzzV)CRRW^tSfdoiPT8M9fh?5a$O)$+7*X?|p9J##DT zNYR?7e${~imqDQ*H;~L}LzVWSMMW@zo@^zowtTw{Q&pVwWV7&6TngeIn}SMe*QKv( zf|!H@3SA;ZWmk^ts8+{%*@!2jWJnhVGG-|V{Y0T^)oywCv2S(9xtqVc_mU5({sGb~ zJdY-BX+8bTTVvW@=76Y&J_`?WH#&+g1AW| z6x9biQ^r;WDY}O71NVKE@e2CoNC|gM2kukpAr|3KbEX!Sv|q4a{hFCbCGi79Axnw$ z##{|)^_I>E!B91swrcc`EUXm^@DQ+KGL~G^1jpbF_IcExFO`1Wm}2Pcj}-$4x}x;o zNf`9_GO{f(#%Gjkp63FNTTB9{&OpWUBTy9U2Y1t{(9hKQsIjwV4u#Yx?QAq3Tiqv@ zhy*L2_~*^)atS8BTr8F*J}SO_Qu8Eib_^*qubS}fIBSibI0P8J-9&Ua3IosSF(_Jm zIAA=1f_A@mQy zi(;R23C~uz;t1n6Juj!)84s7%oIw7q6~OEXSAh4Xf;6OVy9iDMap^BpadK|s@CN?M z49W#eEuH*lRCJ2ZmL&S;+NwY-_+>Y0XbwT$;VSo-=Wo+qeBhXP=qqXwOtO2Fc3kZ$ zLtC#Imy!~Ae$&?*N$kB*KxG~&4|C?nnUSXM610DQkT1pm7&{x z;*?REkBV!?)K8rjKkbxzEgaQc4Fi|F?6e*_qMtpCgDNjgM#*p|WVy=7 zcxguEj6rgidXmh_cnCt*rFEw22wM*$R`f(pD~cWo`&y-UnAP;w89QfYigKaobV1Ha zyAZs~$ym?hUVy|lTpW|ehJ_AUx@3E*!VYM}JTGDBx!;ZGwp`G`4o^UC-AKfpJzGyO z9GrsUY2d_bao2Z;P|3K%Sa;+|Zr#9ac7Bl>SIX;-KzLukJ>Rk$6>v?EgL}T0HPx*@ z3Anq_YdcsG9K!-Eg|^(|RodB)jv!+1Cez_nXt zJ$;5@Z(*xnlL;hOadD06b~0=)Ys0&4JeF`SnPCr1DQLqiy9Tkhti+oVyuRUHO!X8W z62=*dy2{XUj~2=N&WC*)=ZgIsa#gu=<{>__XS#;DOdx52S}@X-^2p?tr$7(7w`Ut9 z-DvBn#6lyKaa&PVl&2K09CmYZNPUXD(^Crp5-Q2IVotWQ)?Ijkpw`kZ;V$@W${g}v z!>L*Cvwxc!58at`3SB<&YPPSp)*JSyJVJkZ@Z%MzqcDXu<#HpTfgD30BPM<8#hAg z#9xx7p1M1Hm_-g@)e@!Nm7#9(b@`QY3>dPA$TRk#WRP$~vHu?PE|Y>!VgJ~_?|dE( z5q<49OX7lfiHL}V*-kD+gwfPY42Sv7H|Esp91bI|$|F=)yN~MVC5b(ZEL+h2l zD^lqXaP0D0$I%9{@D|qb3o%={TmXl0*|?|;FV~Fchtug-8Wh5>D!QakJln{-5Ro~b zERH4msI2oGsvn|HL4-3|v$*a(3zlTimx1OV;Wy%J%%A)M{7?LR?oVi_^zVy#2Mhp! z?!U&*Ms~KQ7H0neLDwit#V+w9=x~*hdw?b$2LEXg4@K;QMItJoug8ojjMb6Vv~bJ1 zaplD#bbz?&=V6B;E7<%6p)W#AM0f4nE7Mg8Da%+yyCM*358}}Dajyf3gR>77u0r`j zA7`FSkNPWn9)oG(J>JfTeTRJXoH+%XR^`?%vY`4h5;#GigHId6b$VBf{P91KqC35XnJ$ zmtBvgQC-Z=U%HYyR$iuGUCL;7t#AQgclZJF&ys;P5Ob^yB@ClN&BGq7bJ2#xuS>5Sb zVsAUObGbDb`bvp9q>~Xuk_lUNeHW^#ty1#3wM?!mdn0N#RR=7d-hlGB_1j?JxEVZG ztqPq@V$2F=8&I+pWnEorW4FPnI5`ij-WY5zUq6iMBR6{N@L*JGv0-LzZWNl+p9ryw zGIk#)E0|nX)y$Q(GJ~k z^vew8RM~_@w=h_~D{kZ0Ntu!M;VK~Y2D?7%g>~z*kkE0AF=(fDo#i{GHYNNMDBhz} zcxNXllhXRmr;DD}O+P4ohM^G9D?gn`{VcFR&Q?*z#xB3_f6eZ}%};v|4gi3MH2?t9 ze?7ZqCblMy2F@0Cw*O&%uX(N=u_qk*0?N{bbT;~T94DH5Dxm%(E=X`{wYqc`o)v3T zuNnZtgtMS`-OUE#pAhgp0(eApi{X*TCH`c_>3GK{@|P)2q|hXAG4b&5?C^ZE6gl^j zPfDu1Lf7CeR}t1d>6EBiYN9!~>W)0m}lau8LaMi?kT1Z<~64&io z7$s8S*7&^lN}t@lx8zHIS3q`dN>X>j)LalR7rh%55Fel#;rWO-{# zJHIQFHwHdxWa^c@ui!t&%xMm}14qEuAlT;pE#C1}6(2iwTV{V2hSt>^)hMf-I{s@TgS^yB-8!c$B5kOzE8 z+MHKpyPIF4c#^SWuI(4LOdxshA`a6@@18KABT}J##Fy%+r&0oAJr#m$pMy#t+Rl=k zE3rz^?kd&a1ckMm>Xn%5#z614G^}Re{U4%V_d( zFNb@1#Si2XTUFcn{fe`TJ+Slq%+0U44X33z%XZ9+ZuzJw8r$-2s75I#jMqW7C!5r* zNRmh}d!Oc$?ge)m@mS&^1w8 zXBS<)72g;4GY%Rh~v@Ce zd8eq1XP>Sm{W7cRHk>#C8TCASSRM@#sQO?x_jE zRxEu^jaU|Oy+(E8ew_TufR*vUtbT?tol2l)ye}2fL#yTEZpcPJhQJU19T=R@L(KCl z=01r@6jeieNaNe@#c^e98BumOJ2Q%CS=hm%bN-!jpp$9mYF~h7&B_HN>0G2a^N*Hg zaF|7(j#W=UCCZ`zYvf=Q!w$KRmI$W4smOa4%#7hAdjx5Jf_ZPUiAFO}bLxFxSQ{dF zaLx$>H$S+Kp)oay)EXD;@;-zv&5`ggn2*J~)tvj;fWosoy%;bg@4@sQNtQ8p3A$G zh8tk~;ar25$|Vw^+YK__;83m6m<=E&m}dRyu6YT3)tN!80ij9(ky@!7XH{r8L^P?s zd>ul@f6Ti|7mMLnU?sWi{)+3c5M76ODQ+@{U?`YqGm zU39lk-VQP8EjT<3R-&7;_c0IjNsRZ4E`U@Q++Mz-gI&ICb)D~|PLWoSk#hi}>%pVZ zQD`Axaur*H5N|+rSs0pRyi2HZ<5We0k=R*Ao*(C2pGM~x42ygHSw9ARNb%5T&1)2} zRK&odTOtnl?KI}o;Dh%f&t<)6wBQXzbO;A*M7sHjQ9)7fD)kw_fP+R}$WFF+|C(Bi zejm5B3G*Yl$zQaP=0dL>Nm%$NUmg~PHilR4%O%0cYus0A62+fh3IGeSS5yhpUorYw zX9p1cAIi>QOAuhewrSh8ZQHhO+qP}nww;x>ot3t2yn4giliU3TF^aV!4)%F9DiV_+ z1U29~Y0LZAlp+e;V#Fm_J)bgT9AklmY4N~;%^W;5I!)i%h8wp4IPdnAsDA*_g|LHX zkzJRNL5sKzySM9uRRC@i5u`}(l8jdsKv_8d1%z6AxlY9EmUnI5lq@PrcJ;tuU>}7SSB?H7@wWx2 zmFs*YqHPQ5i_~PMq(^I(RjY4ol0^C2SP3f{=0#Wgyo?tq(zfR5ws-h%QXk~)9QrHR zgUr&hv;Y?*wo?m~4f0QuEqO=yXA|Ao$b;3(S>WQ;@kr0kJV<;-CaBja_Ws9-1Lf1P zF$nHY|DW}Fm(2Ku82EL17vce@b}e%dd57z-~DfRi<~Kp?a)*#atk)lUOWZp zd7aN!sX2~$kUZvhmJYZ*gIN6m>M{wM4`7^==w+Cpj=hm8kU`Bk z3muvpV$)*6s3*xI;WM16jsEmAW1@OTUN56`bTR&6SqNdt1CW(NNqI=hO;j&@q;^Wi z*LMxhQG!h?!BXhr>K`v6(QlxT^ax47SW<@hSF{1C+9Eb7j%hOv4W7Y0iIBPqy(daK z=za;D=fJ=5-52@-YXo*|P#p3%v(eVM-2((ewKpGZuxPE`5VaZQV*M3M312wXrZljc zL)&DQrIS=*O%MfkxLXp0MUAFd8AzVFh5JR4ix_g~0EoCo1V9%HH-91(N*4D{8-=sC z8KPf;Lu5D@L^@u9Q`l{}l`v2lZRDyG3nMmeQHTIKwX_TL2F`8$fddkuL%^xYy@&_* z>E!|DcLZ!GT<_-%CS-7vIg0qT&q?_Oph=wy1k|R zo&|*;F<__*32KKpA}NsE%f`6eJ)`rEw0sHx*1;t1wFle+2M>YH*!2@M>uxznLB`2F z5ztps{IpG^iuU=FeYk5Az^y~~ke&_>eofgRve91Mt5U{{<2#po-Q1%OIQ zX&}FKh5tMcaF~SGO-ojwDU)su6oNrYWKtgv38yuoxD^^296v3eQyvl-OU<8ffQ9Md z=;n>Sb=#Zv6#R{Zb-UVNK!+dg$SE$3ota>o*gkdDLLq`qwe=Gp_Gn~ju8S$ARFf(u z*2;%u4@aiKeU8@GaAKn^KnTY;9b<(63T}{f0L)JDhdQyXA>K}4ZE2@(VsBtWvGtEk z{LG09B;Joeadh5e%GFn8o)_2^c)X?wb#+&E1^VmQY4^6~H!kY+9;!PQeJCK}wc3$H zIEFnoZ-$4Ha4y=NRfT?0Q7!`cX{x-3f^yE=m9Jh9Pi+joH*2F66pSPjvm3aOpa;UV z*3N}Mmc}@_aS>Sw$@5e5(-bmmc?=i%kpyw^cy{j00Jc!+S*OD(ox`76d9tTrTfybI zV8^<6?!Xgi*+OZp{W;yF{7EuVwaGrwu+rxU(C@o=?HbrPJg8mLIMz9Ivc=MSQNLE- zqHXlTYE8UJYd_AQa>}<_SlpU;LJ4;KStT9r^9q=(rI_vV^TP&OI3aV<|8u>YI%6Nb z1R&0UGtwW`e?4*$FWShE6FG{K=t{6RpBWr7{3$kFn{U!RK+|d>IzMk1jRP}j7kVsd zP$PDP0c_vMiUoFm8_+vx_F<4b7{_SK;WSAFaTo4pZ-E`Y3mMsANf@m-EiQpOed8ht zu2=&Lz`ZVk0uKmOx_b(a8T0aa7f1_fP2m`4&N(?=2PNP*iH}UwbIGjXsW;9R*c%N-p&S8lHbyC&DI8|fK$cV{5TZiT}MZyqe_^4T}^OR@)qzku|sI_fe!tKZq zRiY{ThKx2X42Oxu>H<$o-9bQVO~ep6(|Z(Vyy{|z zp4iFMK%AJSIzU$4neHDiky(i^@A`!g&M6}fe2RpfvJpVCmVVcW($9hKTk(i$vmt}F ziPT2hgWqbkvG%pvRRC*Q>Ms#?tPpzRk(7dZh1;+psQ096b@%w@FCYK4(zd$6vt63& z&1w-3$RCK5Rj?K1zpSWo@{Ke9!VX2myEX0$93LI3M)M`YeGt~>-676bt!dwtr!5ev z7|hWend3HEQIJ+XQhQi83VAzFQ&1cei`5nNbiSrgJ1cY-Hd`Sry zE!x$vJ7H)-Rq{lFrN-RYZw*8qs)sb25KU{`u7G}QTp&BdCt^c<1l|JMb`2c!?t!Gr zrBz)cUL`b`#%NI1L4!1yrdltOIp8!hz2dsc7h6oAWncwe%NK05>okD5853IYo~6K3 zUm2$z>;!-|=5W5O#|$TuSDT6@cph|d=|Ih+Jgp@=IEi=0M?l*`+7rVoMh_khNRLg- z(Sr;v9hE_g4WwQC#OZ;Z#n83({aWZP@u=@`^C1h$>-kFYjFayC3O0q(l5-{VE<`t| z{Lwi_C95@eEEm=g}3r;l$WX{rar|~a_6)>3N>F_h2M%qHH zT-);!{(ZSM1}8^g21c8v7T4ICNaRR88%pvt+qNvzSK?+?oU!Wyj#FqIjj-U|tXuF~ zZPj79^_rtV6%T%jsEjxj$woir{Jp+^QJL)doraXoB1D-)bm0V|tw-7!wh1v1mM_BU z1Gm%@og;)n)QjpQeIzYj=_>tLzqJ5!|18s1adU)~YkIL(ztDy6FBg)Oamv5>i(_!Z zm?UAbz#v~T^VCahM6l>j9Td&$vbT4!#*_$YjE0t$x8Z|{FHDwx|Akl&UoGVx{q37e zGb6iKW#8JupWV&*ew^a}dAb2+@%26m*I2BRUx@f4?eDE$u-oydc8e>+i|W&*b0|9r zD2oC^69DdnzFEgqGT`%-Ycfv5sbz>~5XA{VC^xsrlvcGRA^R8O9C^O7wd%S^b_Lo; zQf_i*r$AJ&5qRIc!P%AR7K%BDxFoI03oo-?h(7jApkExHOF8tQ3{WVG~xxv zRY3=$ynw_*>8LB%v|t9TOK|l*So=>UBKI#br=E%)v=WLHsxT zIA{P?{U=<`6{z^+vLZy}ty~DVc#gzHW!NOpml%eXva9sJ@{l%o+#{;&ckGxHaecW^cP30@AkY%KUBR84l^Vn{`n92e6RFsat3l9Gjx`>4xm&c@O)rK*25m%@+~ z!Wc=+Gk#eTq3DL(kJD-4~Earq1KmT%UAPB({!x9(Q9y+;kNe2l_<*`HX|* z5DM=P#vcd)xk@8NU5ZV*XAMOgpdCMF?|B@7}8f0FZI`*#+@r|w#Q;JlpQYUc@;KfknG*5Y;mn>is1m%=4*UFEQxLA+E zezmX!c+;yRPDvS7tTcDsi;mf|d>B|T%5w_57!9VuQ0~}gDq`#4drPHryTU6=6t(0p zduMX?a|D9b8tH^Bl$g=rWtUz0-;u|a+PZj_xM2b0JgHb-V=yRB;BW2ZS#%d&++DSO zl8TX7yVNU$r7SILUU^1HPkdjQmKetCW0hRk{J=W46+n!Fd063f573k%%O5f8ByR}| zPqs<)K>y^g9bM!V_j#*3S>Q$FhoUgt-q$9S9ho4!gpKRH(+YtHtc%HGma^?3GxyJA zl(MySY~M-(iN$%ko?_YO2gpeV6e@Slpb{NBLyqev;!jFSLBlM9h@)Zu@a6iEZia1D z?=quWaL;Nc?N|qm8VcAKrnp*Yp1}(t#@eqfP(I0ZA1U){*O^a3%yVd{lBpC}d)5 zVBAY)fWd>F7?`>{0m6c!gVuqVp9z4tQZbrbCs3Jf?b_S08Fr6+QnpP5%QW@o&$!C8 z@0WEjnh5t{reB+%=vUs-Nttwj3aE11aQTiAy-b?%G`EB{hiGci+cuF~2sqyV?s(n3 zqhYN0bBR87pMvrh#j+Zv!XRO1b<{ zc>wL3`)c|42)u?jtcz%~s!T}!^? z4=x3@T*24*D9nj>Y&VW@e=Wb-0oCoO&KhQktW~-T<(WJ{w%QOI_={t+1^j9lD_fp{ zY$WGB2qhwzZfI&;>aqe8Y(*2IzYC?v06w7W^<_u}!9-uh1|VYWtuvLMY~S6bWC@hd zHv}=RVNhI|{zlWL7HpZXUreQh#xkC&h>C2LE#jUdQ~*|jH+gUoUI6)uO0(%+8Lt}2o$rG-0F?v zo3%d(@4ibar)50^Z28%jAtnz`h-a^JoX;{D^6df3%S8W6xx`r?$W!t0|chqAH$y|#E>s0yfzGpIOfUu>i)fphMW zPbbW-YA~Fb`4VtX5oQY0sI9yB5c5D*x_LU{6poy6u@ZmP`wNN6_vM? z!q&w0hh53wPrgJM>pR}e7n#xli!YJ{An-)!-OF{W9Z`in7OCngm7Gv@*IQF6Zlo+z(Z=#gts`&QYw=3d9Zomnq-=2gf(ShrUB{N- zSjc_O3f_kT1M}GiS#@he`Z#svuP|p!D_kn^;l1CUJ@1Us@&BtE)@kJ zu$j%oigQU??olh#_~ZOM{C`e>zXZYquqLMob9UsNEFnaQXU=th zMnT27G*h_74w_MR)$$EJ4gSC|!ysX%fJdkF){M_F!mP0LHp2+X!pOxjeMs>(a!n2U zd?)cAiP#N5&vNvz>GuoA6?7AS`St2vTV$Fc zdkNyX=Muu;)7(TK@lhv5YQg?nLMcpC1HfWsvYF-|j+;M?^@TPG$ynfLU*B)1(EDE8 zQ+8+&fOVmiT~UPAeR%3QWkmJ@sW9^Wrd~))c}*&>?Mt%{|8df>s#vExhQbPCmsJET z)2I(BRPXw0$_We{D_o_rAAROA03*o;aa$;gRNVU&7ngL65%e{sf2B zKlIX@f9Sdaxe%568ThegA4j2JbrJIDNFzpQYJk!bf?Hws;5RlumKVl^`qDhhN1UGU zP=x&&MxTPc<9w^$=ZnkzPje=K9k_52iF?A>Hn`TD2>rA$k43_KaP}?;VzKN)L<@pJ z(cRFR=XX;)a6CrLXKX+@pwJiR z$gSU=?@k|rH5@0DUXU>#(1xm6Cq-(Z5u1qkoxrSXk*ezW-u+LPpZjZ>9svOW0EzAY z0`hZkGIcO?GW{<$X)pGc({|gl<|pc1*-TzIv#^;j;)(mJN*61pgJP?`oU zFJpbtFf1l@WQEY9IY0Uf7cB z#*wsZRh{$S<<3RqZWpyFrMU~Al^m+fK`#6k!I`Wcs`m!_m70WB7U+F2aS11aRy}&v zG?p%2f8sjTN)LJ+zdU_!Y_k@G0c@{bGvxc;x=H^DBUtvId6m}5pxoAr9AR!)|6LPL zX2i^_(^4;Gw&(8<{#QRg(pIMaZ0vlhf!qz&15iOfYV32w0x6?IgzH_^6<7vzyX!%E z1I61T7`uhIxUz{UYup5bh|jjP$I&6LbaqmU&{AU;2Z9&=UH*u;8@g%EeC%HdUmMKR zdo7&SMZ~!gvljK>DpgZQ`ZU$DD3y-gIr?Gx9s3%J@W4SFeHmU5%yGtRs8w)<0`8At z?mtVF&H}BuT1|q!uEZ_^?d8tlJA`8k9;xIoTygyoC3;g$RF9c7A!eqCU5T+s3-=qPDYUeWA^5=P}=A%>! zE~y6rWihp<8i^gP3j7nQg~75x%5mjEw<+jbt0LR?hzI)Oho|=oQWqpHKAp%;E|W|H zc-&7#B$DO2>0E-cT&k^P`}SxNKG=XAzajpN{}T{e!b@mpl!*)QH9|VTX$p1FZ>Fe; zId7BK@rqdoWp@zAe|YK@L-zp`XF`<~18XD%9;1Og2pE)54&)+HJ3I(;I1ti*@}5f;91$z7M-(lVXvN8EbU*4YzH)z{b3%7q$5X{Lxu(`8y z-ucNusp_#qGt%$r@fbA+V3YQ%O*o~BnlLeo?xLzL>iYLx^0*0Mfrm&q{vN+rm~NI( zFlt=FB0ic%c!forMuIOWYluU@Babb90v&OPG`SRoi??pAv0LG=tCS`Hs}$4R!!`ve zg^Ez8O;L*lX9E0Y)SIN)adKMvAaAxqk4dtP?Dl~@Oo_kZouggijZ|Q;UUjA9nPWWf zg8q31DIu4W8($>j?cb+Fd7HjYkI>3laESTf`nggBeo(v9@PRne4b=*Idsa{a#cHT} z)P|ukR9FD+I{O1dZDfC_ORG-J5ENLexEw3q$idadpQnE{usA!G_hcoYG)59gpZ zkGm(9dGQR>R9ex#rX{*rk2O1paW!`s{n!YKt1n}Ktv4}Jo(Gzj467jL6zCRl$4G+R zX(l{xLQjiOKYFAs=Dp?+$_!|U!65(n#ZFREC<8wiM;Mg%-Z&bK9fIj`hz|#@p)*?$ zi-~zBCt=|)Cpx^X6Re_-u3AY{rYk`^`v&Iykxb9fcyj<#=cIk?6HGV6lQjcIlsgcE zrs2NQi#LcdB4v{13K($VV18k)1F&qS(oNxWW@1eO541rIlkkf2aUUaZ<{f;FX>r4Z z3XfIoZoXPgM81o&Q&+8VW=Bc8DeM6Eax)Bg^Ar-ZmFM9v@vPT_fG^d#7+qC}QWchS zBQ!trS48K2zvAwTJ>Ae`6D?T4Lq;e%xGlnrWhKUt+k8hi4;#h`|jGeWg5W1 zQohP5`XhS~`K*_FYsNaN5zdjY5%~{x-)c{Q_(QX~X*-|4oTT6G z`(s>Rme>b-{(GOfv>6(;C#_1qiVF&=$i>lvNKJ4-kZR5uA*Ono zvtkgcqpQsV&CinO#{3+K6_OTxV&0lQ1COE07j;2kuHkN>vC zw3D{ZPWcpnU^TZBfX855~>Alr>Bk?^^O{Qtg)cKV-A77H*a;msc0V8NYMifo-g^x^r#83ugDtp6+ zyz8gR@F3bRK(Z)++8*Y5z@!6RS$-Jn`hoHFF_XtYRUJW5MR_6HKyZm&uNVT-4T{xc z1D^~Kc$5-cx5y@J1(5s(l}EOoL0yrh)w-7~d>k4sg64u=b*oD-JrdLI-05e@J9WhT zdc1bJS1*~=;bPDoE$XC828 z=HPcfDwzO8(jycsiwc6<8H+o$B~rp{+*V3HJd+$H`2;tl!{g_1F4wUF2H=^(H(G zY~FeHcPdn=Su{Q8U{Fa~xQh@7yU>(vh(eGL(+AcgbPillrGaLoMP?M3xhKp_GEKvt zoHklif_^PwNuN?PCs-2p>$(~xANE?0Tnb5#pXUlfr`n^s+n`Fx{rGK_saj3@xw zW}KKq2q-TzPLf2}L~=LuDrU30TJufD zXUy8261|wy{`C!G)wgkZ=z|H;NSiyY`!&RkN(T;V-820QaHD3NUz>eo$&kFI#C=i*|Uh)di=fpYQ-y$_ZX#)Z#SM;-j^)r0D3&rim-pr z?~P9eMEs`2x?J}hxanHlKV&&jl~6i&m^-o_mt=lB$Ykz**M5-}Mv3HK__MxY%!g_~ z*tJQ;CjtDSbvToF1s&BN-CD-5Ph-`&sv?AnAgM4n(~x#S@(D$5N#03iefhLX){AGP3ad-=O1y~zQ5u-z>55DKy~l^gcgXfm8lu)H*Qgc{XP~*S|ZH}RTS2A5Y{uI zLl!A!7z}~IcBU8u;^0TqRO& zavDkl;Y5yL+s8gY@dOgdwRL(8?il&Kunpo-W&@7Cg@hH1@({-6VUkr=v@@2Ov9rBa zI6NY`;bV1uLDfP>l&rw!%QAZos15|e1!=qCw`r>=}WBKECZr?*aaXaq6 zbYDxukAZIKuD%pmEHR%ao@jd_;fF5D_YR$pN;G1sO6!4~H==+KcjV*+ij0OtZ4^`A zVyk<`%9~e_fGuDeB(0wPSPh$~GlFtM^0d@8Qn7!BIEhmu%>gafo)YootQ{_(P5CTt zk*b&=dRUO|lgy3n;M;kNmzftm>K*g$AWE)-N`A$n~=OF+FOY+ zmCJVIe!wC2 znF(npA?wnnl4`*7nhV=wj~W#b^FapNlqAmB^9f1uTf=eNAF&tO{#&Wdc~fS0Dj^L0 zZ64c(v6Q|no9^{x?F2wHZUnci8HW9QF;yY%MR)CH#e;`&&6^2n!2<>2TJ49X%Cbkq z3o(aPg9hfwjpmjqZ_7p(xE?^$(kzGlVj1PN(r+vAy%%!mtv_)V@u+sVqHoOl%IxND z{dmP1XSAQw*24iA)SA7JvQF$y_dFq)v2>Q11Cs$fkb-w7OElQ>^_#T!P4g{r@k4Zn z0-8^hP2hv!!4c@#@m?bBWn~p_aw=+~N9IX{8KaVY8(kAo_Zg79dbZ#4OqySR#ltI} zF3HZV_GB|fY>-pE$@ zdb!k3PQTXY56}_oI1OEeYTP&hpE3bM8jK0+)g`+@^DMm57rG+^J+i#QbzDU)VQ##} zNrE!AHv;6NK(ucZ4ck!}>iwsK&ZE_nwmmzN`{=i#o-O~1ZmV7r5zhePigpgBhvAbj zh~3uf&BGEjc3sWcG|F_#i2Z{8r}AJr?ga}51pr`$_kYP~JJ>tB(Ek6D{(l=pS<&3G z!x=;LCF?J0g~-t~SWh}w7fb6JMkLXIB*H`s87>%BkvFRk`X~O55DtYNG9?raA(xh*J4^PHvg?=SLTd zI4$XVT}a)U?Y$XAE3K1CjxDv13EtY3X!+<#1D52w)M`@aY^xc2e6ffnQ?2z|GHSae z=}p*Bra6tXy$rd*R9aJtwx((lUA0qTDrF_Lu_W;x-wTQ9)sTR|;*LvxLtj?4FZWm3 zjLr1crqq;=qw2UYcotIC(pB}zP1;9cF-B$PSSa-Ylq46@d1cG)zM7LH_oYv%lw#J- zYs*zxt2ND?>%hM1s(ObuMy^A896)JojNTNjKOSVhd_i$o2$Nds6De({%!YKbM~mi< zy)B4eMHTg-sn@%mu>6zQ22w&~9hcu*LatBWuf#TH3=7Ts@#$Fn+uG8c?_gt(Bc5Vu zsuv;CgkMZsKi%ahlc#Z@{}M3z79PH(KsQyicFqtPv+;HK+WY&6rM>Xw8D`oC^wH9H zaCb#Qv~BfNbn0~71(a4(c}>ciQvObHC;Uo%rCk<{@EO&&PYssb1dcv=LJyc%ZBE0# z3MK=*cS|Lj=R zC0uC>NULI|&L-TyeD$Gu@Ke9>trlU(G15(i3oQQlwx_TMGue=FH+?cN^+a95l0MY8 zLwKX^YWKsvi^@$N3^Fk<$gE4upbI?CIUYhD=@JMb`RCrDmgC}KuXMbmm(P*)kIgn} zLsQWK3pRT7;UTf1-4x7Sx~8$Ikbq=n7+q#>CQ?`2o|u&!IUhXHLltPVgA0J~KGX8x zGy_5YY6={HaigGzq4|A8+8MJ1XSjbFAg#294Hb?Wm;s&ic5@8|l@Q^1!)wp^06m+K zro~jVRj(S`eH%&1`;xibyF(c*%{8I-Q2L@VKjxY{Q*gJ@$X4k&rKB=++LH;d@8+N< zRI6)iAS?EZ(xnu6vR%1LE&<7yiPz*_IKHY{V{BcG2^6S3;a-)T@uVrRZTIC{*QBZA z&smVNkPuPLpJ#Q`R?73SjMr0iI8s zs~`p^zJGBlO*r5h~Au@>r;Ty*!rA#O5gV2vG1(VA0Y>|tCs8(*M~oe4L5^WgR7 z!j*P&;dNG_kw?AL&av5RamwZHAH7sB+=kv;jvsmHt+Pc_1lnt#Ue^iK#M4QZ>JzaG zYfCvr5)D1TkdS2^Gb(r1M%uu-0q2I}kR$j@o?DQzmac2&THzJCteB^`%4O6|nC*b-TqEBP($nQ8-kfx=qEo zpy(ZyGmOU6SsnU9x}Ygx>chs?&{E-A+HJY-F#MZqt(1&Wb|hefkfQnl;B#K*$OJen_a-PE&p(AD^aDqF z9xBrr`Q`=HHL%`ayZ*nY-6%W4ARvhDAc27r5;OeV$J#8WV$CMd3a1^I*h}3JD?1U3 zts^LnyVHBk&pH>C=2t@=vmed3$-z1ci6!P&)xG4w^BJa;fTaHgaa7x@0gMzc~vI&meNsBe(N&6}g1u=d?NS zrQCSJ+S-kA-Dp8JMRg#M^-!3zB0f+e&cG|=K_*(}WSApHylkdur=~}*lGrMm5{>;- zqgqMMG2_D;Pv-`Q%IbXiBk&U+G#8Etv|Ip8s&yT3=X|f|PHR_|0)cDbpx$%`K@Yj` z`GMsfqlr~Q8Qd_C+Z0K)w0RiP|76_=Q85rU={vKpg*Kv=J28qk{Uv%y6Mkag}6Yc2y8#gjzW; zq#!TPHd!~2ECR+3K>oMSiMS%c7VeTh(hfP*zj6YHs zI2i#bKME zI7Yv5^JhwR)bTx2*koRKP>6cUeO1@vJ*~ zpwh=ZZsGyfoIfN+t5CdT9)M&Vt^HdD@H`M?%wL=Dfc&LKix#M=NV=V7uMTh}*F)`^0eKjRI(S|T0Veh*tv&Wm@9*D=b=7u@@dT>B6G`)1 zq$*D;mZM@VoJ}P84vz(L{gt#8WB#{t;l-_@h1AMTUv?MwTdRI7citUZ3TwbRC zNT{R7S_WH{-p=G7ArNH^t?v)zrPFD#`&K3QB<|kdY_$6Fi&m0*6s@Bkj{V}imXEjCu!WBr!@O}5DlZq zDrVfSxA(JifHganVJq|;rRV<+_h*j28o(eF)j^Xw8--9s5G$+ggx!TJmnbSq8yOz) zADWMd5~lUEhC!HK#%NIlG`~j4!qE2onLU?R@9ZhW2IcKrzL6JIJ*U4dnq?x%Deb%1 z8Ra$v_Df%s7Ho@x=lXj4AJpXh?aC_(=zm5R2><}&|GE}vY;R*@=-~X{+^$y5OQ)?4 z)E`=2&`EquDLb%I!Yx_0sRY$GWjLnc;6I0$^Kw$ zK`pnQ+GI&GB0BKXpIl&-OId2xr8Vq9yLIYPs#4G5UFg!c%yEr3M~ar7pY>H$&)i1& zHL2*x%_>4 zTE$Ma?=tM}Ygg(K!?iOj+8sU13Dr?FBTd#IGCs??5k&P<-d1y+N;_IKVl7kcHJ{>! zYE3nBOm5`Z1RZtTL-A?L+pW+F_z|We^{jV5PV%{K(b1ox&6AuPAn<+j$SRlAb)JMAg-q8hY68U)5dlWKj4S?Y-|d6HQ@!khS8FE~)aLaRD@ z{k9EEo1U8IU|~;Q`F!4^FL<}`iQGihO;2n3dB1$W#F%xfIo}^s@K1uj-wfVY!sQ25 z>S;BeOZS^!HuNDntJkFGgNYSbv5a~zE<3E*a?FmU z`Phld>7Ya4MyCE0%k)xWYyQ;IlA;4$~q{7JYY&Ai@Gqt-hTw>@B03LPDE2w;tW@J zh$unQonq1 zPO?3Fqk5c~Th%>jM+wyzbDwuP=ncE*V!U|YKDG)Mc70^eqDdrC+uoMFm>1LFmem>D<_i>FN zAf0W$pQ2Q%Teg+>u$!NAG~~#PMdnJ#{i9Yfv+*08!}fLD7|e!H1kOw+46pvtg3JC^ zGa0*%aU7Xm2m~!ZA+Ct$(A0jTwktfLS$Fee$n7xYv=F%T;>tXlstU7Qd_tj?*DTE# zY*Feb5N(lm%i`PyZpSJgbcC0PTH3a-;>+*8$5hmQgiUmUX0Q?S7gH&bWcsAT{7#0Z zA}s9mcM&2~VJ)z+rv$YEWp7h&C$0BA$UlzHJ5JX%Zc1&RF63pWr6fcf`pRH5hv*Qv zlQ3^E=8#>|`%uWg))GWC`b!YNo?`%Uv_p#0a)XvkY!jt8$U+`(ZJnGq4U)6a2_AMQ z*rgI~1j{4T#5eoMg9D;g2^G{|D~PV64CEMI2tuXd0`WC~yF?jc9cJ$j<0n^>_rP)8 zoKCNaR1;l87r|IibfC6CTO`(GN)0=Nnvgu|{DK%kMdBjV8bzdpY0X|_I7;-A%?|z5 z&6a3k>5R{56T1yqTMvp!Aa8a>>6r2LkHbs=Zl`431v=V35im@?JPRloa)M0H&dRBnp!(j5tS=P9$!f> zTx&(8>j)s$t#gAo&A75RtO~sl5gF4{7uY>$NoucRDkNCX;d!Me8Ku}VjG#^ET;ON9 zhU$cmByqRNM8V*1gBb*%I82OF!ZtX#;;PKF!CD#CnV3t6Mz1TA_F-k#)`{W-N}iY^ zsqmXaoQCz`S^a4wpAk$2=>d}sUTHM@Mp|D$lsk497C8vPsxTZzs6wmBMFQM#iFMf? zomrVhuSraoSvjy6qJd+hp)Ns1aSZVeWL}0rIN!!Ig8cxk=T3y%9@M$PG&Kiu2eO^% zMZglK@0|y8DXS^Q_>-fF0*_`s13VT2Po?&>KE))ZIMUH$x^z=sL*#o-8o{?SS>L$N_a_W^Iu3Ck zcczjQe{=El#2foPxnA<5gzDAsn#(OUfWUH{xoM!mJa%h*`U8B0G-XMdgN>S-a{q4h z-cH8?QCwn&f3#8v-YIm8HOdZ~kPJepo&TjF6B0(7b+ixTV34cN7JL7hOf{1zjh1T( zA=cM_H#^pCw-o*~(QmWL*ZM^%#J-Y(0k^#g0;6&c&O@dq%TzbFmWGB81^t)b0B3(L zH5BzouyFH3r~}2C#R{;zeV}+Rl5~;v3rP8^<>paV08sy$4-Mw2MHe5UsTiy_y~}=T z9Doxg8w||4a3fdtg%%=jzO}4%J>&zKTJplH4Vr`dqI(BmTqCHyHmO+xI`otad)HF5 z3~Ra|xMCKIs-M7rw({uP1T27mnhbR;jj`I0)aq!#d=Ym_oh^?6y;rh-W0yo>%QCI& z)|cNODsuLF%?<0jU3C7!DRd~(jKDIgmT->#T3p{M6F08HnJ<|coQ>r!xJQ!lW)@>O z`7z4&c1tfMcgJ@PFp?GP&X>@JAL7Vtdy5V;pObHPckrl6H=2c3b~@$06zbzBn-`RsP4=6GB6+xvEqur^y8xd@8zOhhagwN^x|an&vQUsabJgWCl|9bOLh z*isl#nUuM04DZRjWOOfAajh33Z(v@HqdE7@!9)25${aJ2_a6g89Vd}$$smuyU}Ap$ z0gBUV_rkMYQ`NoT$t)Z3$CB^{Py0wy>l#N$d+3_q+7_zfBB~R0B^LG*p}&ne#9MTW zDi|9exc+;oC!NjO)SDoc7Q3!k{rF(t+f~p!TC^P}Dy^Q@9eUHxprG7v>IE-$P5l6_ zr!Y61yAHHAjstDvd5e=Rf_i-QVnX5onSyPMhLnc&28AZw;&DFtxY1~i z*fp-WbtbV{e2=pRIX}lq^@V4YdL?u%adstVE^|p5?*Oz;1jQ*EM~#8Zh`+6@%yp%p^QQ)rV{R`66z_irjtO(dni+R+a(^h`BecQe^TRxN9gy~*hMlnxIK4B$k^n!7+L8Ij#>O?VU;X{r zKf5OXV(1%Bf{!&|?XCA1YKlz=w)4Xm%@5)iK115}77jA?Mug^qu|#1jo_@QLMZzmQ zYmE(;^-eJYP-`_PxC5<>BOs2&r853~U+Xv5XOeEVWMy{mf4Si^zh&{-?6RFj`3tka zq1XW4!eo4UfVCey%wtV~@!Bkei=N73VqVT52^Pol*gnR$CKb9s-;}}WYX^M$|uA|eEXMgmgRlU+UmeWKe$@$=*-Zu5EoiV3-EIp$VILgYpp2m`yMK6&!vc5jpY?7m|u!!t+dA;j-I*;>Svd>nu~V_pM=}&XQMp!NDoD} zXIrAa`l{;m<07fyDNmxE@ynhZbM#OiyC$)NkusYHRJ=HQRbut}5~U4NzdRMy``jE< z&0JPb)q{~(V=`Z<%gPqTy}iA2WyiPuA7ZC5CoyX(#M(zqQor~2srp6wLlqz5lpi7| zQl>(z&G3$-b|YPzvl%aCX+fu?)*9veu77oUJh2Lqn&z#d$rB9q+3SK%14`kx0=4~D zjT9$pYjKfMd@q0ShcMMNVby1%Y)N9z=5up$BO?S#z54q{OQ@=t->$iJVJrp~G%-Rxj zH@cOY*)=cX-g9OQC1REFW+Ec+V4t{=N3g9Oast^i3Z^8?&4r<133HMnTN*NPBj`#J zaNu+ImV6`gsXP~kX8G?gdk2rrMV@-WiYms#rEXg&!|U1S$*7Rx7y1hjcdrxlW#pGD z5?#|v3MH?7;hJKlq-VR~_`m}9Q^ybG)bxeBF((XWZ0zh>`1-4j8$T0MvH~U^+pCW+a8#Pmp1#~mIDcvXR#OC%2pW9#h=hSQp7;$)^%8gMV(b51hI=Hq^sLIE2vn1(KXXzNCEC4AEezC)e`+?c20avdJ31>O=ZS^lX$kviA;dl+=lzOJzpJ>1#$;W zL(~2c&QlGar0;zm<4k@6T1}+-xSg)ycNtZQHhO-ecRgZQHhO+qP}{p1$4DlmAWLpmJIfRhbbPd$0YiS(s{+ zQJw%%;sr_s3_6l!yE8i}+_TfyBfLlC82}+-4LpbYh|#0;RhFpQ29i*dHBC8lsD|PI z8h~^gMG~JeX_16F$KlUCznpLuS>lB0#Dj?-Z^FXAWy#&VEkKORV6$OlLZu(x)p~|=>YG02Z?^)!^3D-S z&G9Fsg%8ZvbZ9*3qZ_nLZDj}j!Vf1K$g;T3*Kn4OGNi_0^d| zHE06iS$*O?`_Pn)6w5Lo!{-BrE-Lg;C}Cv8#9W}v;|kD!K?4N)wRFSvpaewU$0L8mjr2dM-9KNLtcE*U z@6r&QdKMCS(WOyjK~*OFKl^GUSh5&Sr8jueZ4IEwX@d!_K~RJ>n=E~xIoyKlsM+dB%UmOSFdi(*DOd8xBD9of(Kn;rT;Rp%jTp& znf3`q?#7U17k5R^F?Q9SY@*zRiGq5OED7S)B`do1{y|T)gmsBa)&!a4E{T$Er7@u= zyAc-@vu$Y`NYFB&8@5#(pC7iyZf3?1(Q~l$%;rOH#$?Zia6anXkjd}LB`Xbe1b{y zJKxd^SI59>bcsM5i?x?4T2SbLl`$_ZR7VVDErMUm@u_-n$u5H(`M6vjBVINf?bA?G zQLbRW@U_t#+DGfP74Wzm1*m9h5vb=4H~{L5T; zLk}imKKKA-vsb4CG8cW)V`RfZSgv$k9>-B1K^%XgFm-LEgFHt)2+14xmviE{tI30LmcTqMU$vTJ{_7m0t>x9H*3XB z;cr^?PM#0viJf{D@p3q2haN3~_7!#+Q-*YOwl_g^{^h^+wam1f{9&YZ3Xq{c5_8`9 zWNiSi_I3-_{5KVuJ8gFjX|G-wq$cH&fgEo^rGofC<6274A9LlSk^8)8{!+);#U<7Z zq6@Hkb!Z-ltr8xPu%mXzt5I+hIH#?;H(Wc5)}%Y5{ydNM5zl%>p(IgZO5^} zha=Dq6%X106Ic(<53&}mB(5$cw$)7>`p{7Erb2?Fc~|MsTwP&J;VGSZz}`7k@TSvN7X`GXZ`?oy{?6aSi+FVGF%X9G?o6L|E4Nto3Eh=9y2WAe#>NdW2scRyA%?={Ws zIPmmhH~_Rp7zH~}0gky?>P%ZaT)bh>ehttXQBBhdp}U1K&X$InyJLg{aD0%6hf(E$ z4Pb%a@fq&Tu%5Mp4}%A|LK58`SB`ANUCD)k0Nw1M(om&_DlJ4>3#3B^UW2hfkG(sg z8%WU4#n=*x)_^QjcCFCbV%TJ~rYzc10szaE!G_vrgRgKRy%Uu1F+I{U5?4=rL|q`- zN|}j_kGnOUmE`Zw$d$a>Z9&<_$b5Y`FJ@I40Rc?8QC87uPyRP3Mb<&yTkA#SEVULa zQU30oMSDn-*n7m$7RirF0#ALkxW(4XOnMUy!<1XDW=_PRoqR2X{n6zHbT@T2;YMSS z7aKp#0>7)&0%b7uK|M-Et(VRP60?n9c>d^0yqaU>G4_R~I?nAAbuC&#D04$er2n9j zZH00MB!i{Pe>?6;TK_}kcRq%fpn3nHJ9fAIM$6n|SX+D+qSh?NooZRN7tbN@j8U6B zQto8zIy$s%eYw3Wf8h>?;Tny^!0@Dy@iJ*WeD?Jol1e%(dAogGOGaRslVF90tZ|CQ z4mU6Q=K??^?P57<=u8bL9}j4ah*~yzEdw+0T}_T>seNd^gM5G&gD1UoH?G3xSW4#S zKE6#KMhZbo*LlEx@8Xr1{LmU`Nzq+%R)huo4kk5wbN=Hc+z~yir9b-|E_R$i-B|qh z?^&M$=4xld;iQ8T8bAvTMMz^N*3(Lpj5W$hb9bQfp=A-r5}p2;F~aG0)^g^bY?^@K zz0V<@s?g`$>6;rZM3+$oIO^PWz&xK-?EMLFl~+X0%ib1dqrB`STRmlU3QNy=yeu!u zPb&4HwdllG)mpM{dy%&{%V>*s;?3f}X}#l2^SB8%x;FbKQJ@|BYJb)(Q&WVP2B)Oy z&VVu7?5d_y?^zIamPCcxiIBJ}=*c*$z@q0flxm!I$)*yPEUzM!^~^KWsVIt_eT2l^ z?0B16wa)V@o9lWA3*EAUsrhJFr$#}b7pOp|Ell8M8d&eycqDAhm6{*PC+e=%WB>hAX2nks}7(jOY;!FoslLxTY2+DkOxT1!p z6l$miZ{tN@;=EPekEaj^R&rsjLwOhhyuEzjDCONTWTOZUIDU_jd!@kPT>1Z@3>J5@ z3GOgq4Snk3>{s8GZnv4!+*rvOWA4(Qti1!BQ*d&&Fj3Wo07OX|GOEksW7{G>bfx&!RI zuCLl7FBI{<+F&Ol=9M|!t5{U*l`W8MbTvH7-Dk)Ec!1-jeY@6>55Ux;Z*ou3VOP!B z;BI_d$-J#z3muPsClXu+aIbQzz^ymz;%lvx4=du>rC+!3ta!#FI}1;dWG-Pidt5do{*|F#X15>#$$iHF0-FAZ7_@q5%uDS z7`uAfLX%d#xSI8&;B3V_W+nIMUa*Y0Oj&2L#Hd={R$-!xZOmZ)JUsJNHGX+4>OQXB z41bk^dk%S?Cp%juCi;>9VajqGqaf{NUgv`^x?aT@vFI4I5Zu(BB6*)*IeFQC^->m= z*PGgS8D4nc@A~mRBO0hC)P#($>qQ3{O5`ei(`F-s@U3DQu9olxs;+zV9&`G4snUE^4~V>b~RQm&4+4G zYU@CAOi`o<4Eop!skr^MS}a{S2R5+=+w{E1WCiIh>NmpSdi{Gdrt_9Zn85k{Kjbif z&%>t$0096x{{`G){I~4j?DYRLY%QJaY*ket0f6UsN-h8ITLSmE2_|Fz**GP&CR2%PG9O z1rL?ScQgm(X=O%Vu5E^~;vPuzbpi_7E~tX~*=fs}lI8pg5N?@Y2X{69NY!5*O)?dP zJLG2onOH?fCblJfIz`WB)QgQ&A8Y~E>#Dtn*nY{CNi1?`kUD?s5FbQ%PQOHgUwZ03 z87Gz`mPRND*o+|i1=yiV7XX-q=xBG3_<`Kg_g$vLCZAUMs3s|RSz^*TLVhtLzr{KA zc&xhK{}I_LGbRHig$@AVqyPYb`rkidZs2HZ;`F}(e=R&)wp$XZbFb#1#7jwn*E_xt(dlH;Xj>>1ri#7&wEDTHz^}xvzefBfy~cATwcYDdWLpB8 zNSZE{m)mwFhCLNoYR&N2lz1a?E-RB?YS+V!6>El%bxbzKDd;CtU7a0@;v1E=j}zbZ z`{*Wo&ON)W7pjzH-3jnnW&kIR*2?%YtK-cn z{3|arV>YT2Vipq5BD(06HjAz0)X?mle+H;inkT`9oo4?joz~2lh9H#-zUwA|`{}t5 zYDueibuLTG9bJxfT~5aCB1fKXiK;Do)19}LX4HCq!uT9aeqpq{KD^7vP;To!zjEwx&e7sg$D zsQm(9`+et%l?W?Q_#qE)@EGz_rfu0=6kC*^ife5TNP?FO%*?PeGS2L-u8XuY?ZOYj z_NO#c|NOh{Tn6EKXKu-_m|Cg(Df4!N(|ADBM_u{JH?gE0G{H;blwHd~y-?={>SdPk zul29EPUoHI)Q|KbDEdiN;nZ8>v$=r1e?mgo;Q1uG)uT)?V~1s85(?m=<7sljlMfQ#|F)1R_2S0rxCmN)MGqb@=nXGB6;E)(#)Glpp7))M!kw zpsT;2No?@|ygVc`8>0E!yU%M>&UIEp+MzD^ojUD(+rK?)?h;u(F!cQJwR}#%L__f& zvEIA|tb|M3gVs}e=%m08BRAoRL27I^D?*-vx_rrqh`ek14K=v;Ahfw8j4^)-J6*{d z_ubM!rfo&az-Il^RKwcoQ#}@xd;&i(lvvjkc*v4VJ*%%zHQI`RYy*O%6zWE9cSku~ z3O1l5$b>J`>-M1uSa;A+WsKp87-gpF_ZuUNzBwO%6^|!qxxYqXta8~q@sUPonp2S| znTg9lZ4oFz88SaObrQmmJTqtxt(BAB=l$`AFa1jtJEYv~4V8%y#Re$UqU8_XmDm5e z3d%u^>@YY*BEY&a2@x=2Sc*@zA%^8G)4gn)6*-R>iFiW;4V%D8?7J)zVP?|bX3>#C z6-j?zLr>sw*gLRWIL~f~(vG;K?;X7>EIxQovm;qwoY2X0Aa5l7uvLL8F6~}uIdByq zz`enKrUUph1UHiBZ-}sPP1JhLMKs@3dS=%iREaa-kH9JC^-sHy!z+|$i2W-2V1@|f_sRM0pAAO4xhtsw;%s)cjoMS zxZ;Pme4Uw2k4#bY`o4Z(UNPEZe0{3@0WTLo5TDI!rh_;?ZQZSx%PPG9hijyEYz;?5 zjaeX?WsBO4+%X$iM~tq%YN-0wQ8y&YMkWtUDA&MP4b?W0IvU!5r}X#?YpPS*E~F$k zH1~t{9Z(1F6mihcBIdalR822_WKzMgfw4HCd9a=PosY^Z>MJg?IVTL{_uvUHT2s4B&N#+?UKwa7t zeP&!H5Mgn83x;qKrgIt^?fr`dpBxY~3g&l_8l~Zgr4ppGB*XSR7ladBAd$xMLH{af zL(>Qvh9Lw6l(!dn7=oqO3Y*gC^i^^Lhp!!|!qf+m(0TrLnX68jgbRt+w=dvxC3_7~ zOZCCv8TGsfQwRi3EQ&`ZN-Ui2{d&QKs4k4>T<$ZBRbVI*pi#U53Pebd>%Wgbvk}P;z#!|g=yoxj|0Pw6lR^io}2y>N*jTmZS<_gv`nY46Esz4 z-|tOd^=($;#G!^pBJ7j3ivCDCz9;mfqf4kdpWbsiXpPaACQBvmA)35O|F;nXGz_5JU*Ql*D9xLp`-DT5h3V5Mg{gBRx1NiTcR3M* zSF3H}2I-)jetU^7ufQFto~*gN7G{oxTU^dTbCXD%Cw5ubM`;``KvZ^1l5z zl+wVr&FnS2Bz-0AtinvBs^W41t&6s2p|Du$NIP6YbJ*qpmnRdAYn&jq=u(n^v3jHT z-)%g=>{3mMrhb0XvE?TTais|XB&WjRQRKs85Do${w$l^4W@&3fSB*)Wjh@2UO0DMKKn*=m+()!Cv$W zo-JrDnng5j!-Y4oZ!9F{s;G2TNu41ojX*3n_CnMuchR07xr_|cn1ESxx{d57`~l6Q zE{hi#4WqecAecM__s0vIovB3;yLed|%DT$>6>nP{j9#754rDmS?7 zgeM#!wFES7d0Mjz<&AsAhci~)?&0G!vw>~gb^w^rm|TL|wG@=6yT*fhW<$<*F&PNpTI7yIvY0wax>tj59hP50(y96RjO zk*-jB(r87hFk&~Y`Khp8SAm9LN&%`Dmfs07;yCQdgitp}loO(MRMHFn^ufV*h0n0D z2nGr>^b*aGDZ}_dwoO6t$-Z&kLpLvb(nDRl0zuRjmJ>3-T2VEHy^Pp?hM`OJ6cdlf92;TOMG{)}3Hd5H~4*%5SuU;=rTq$?Zz0T&Uo zo6&$w0g!cwWDh`^BBqQXKv}j@rg<}p4>l`fCHj1X!wY#jSZ6Nc{Rn0oIs=;dr9vAG zS}GvvWpux9%!$Qj6Z}aD%}5VGTiSc(&XEyt&AX`aY;Qz$woAuDndLv>S#1I^*M@2d2(yZ_xLToazZo%6sQml z6_v_hGaW$tr#_3~^7ju=)gffps6pno3X*$Y0?KDCWKE;iPlvSBD#F_O5&<@3U>v|y z@e0LJ@%0(gl+0G~`&q=J34H#(^j(1}^S+s^4AeJLJu2s=Q5hxN?rDH&;-$r&?!ssy z3Jr3Rz0SfjT@K}Qh%YHB;|2&W#~9MO(gOVo;3lYtfCWk@%)4jDk1Z!%;6_4JkS{8>q9wvOTM zSwWq?pcPSzdw^?p#kEHOqi{k*;9i0}6yPPcK+9RrVM$;7Zf zfS(a4bZ{qUt9!OcWb^HA`9>UW-w>KBfU#O}|HPtk-kVikNAItfny&mIrjzlvnr$!nMk`zQTmF$Pv4m z8#WcFR}VCFj_ukOONF9Yyx)Fx%Bv?w^|)^Em75S34YRMJ1=qSff}LmaMD-eyy*kF` zYmjua|7slO>cH(pcMv3*Te3^+mYY_)?jG$*)SbUW`PG5(DVO5{*RRp=qNacp#vl{q z8*p%#uyTxz$=)>cP>NxU!mFo4#0G+FdBwn%CjHuZ-%z})qF&I$YNtgIpEA}Y)*up( zkn`HoJY)zuq)Wbn6c7rSNYrj}4zMYdC_T%-n+^Z@1cF?#rUAc5^-3N30Y4>elFR1y zIaJ3@=5-xgCU-q`<}n{v0(0GtueHI>B6t0A{x;#d+b)vay*KzQQ3>`R#iyy<9OA#R zuTysBKLKv&{$<^ULBd)EV6P(;U`jX~?2$Et^U@6yOZU>yUy2}3cwM@s57jL0Ro3 znM&YBQ>910BHnzOkSB68-0<8F(2P}~pnV*QHZ**J;n`88(eize?%BHW&wHR3zB5Yz zg&?LI&2{S1SS$DFB^AA&M=*(m5^h7_Hq~9;`UmNaD-uX^3;KKatz?#BqlKN%GgHwQ ze3?}DpU=`42yV zEH6foEEX!)3K6Zat-p-Oi$|<+!#+%gsK>Ck`sZ%|bte%jBST9auW1vpU#KtJpMDGK z?^P^jGK@cZEx4COtG9#kwH~_5rTsbf)wmvP z^{E%$2G}|n)!c=LjpdC!JkYL$OPna$@0CJ+=do7q{-S@#CcE!vesC79xl@i^pr7w! ziBnv8lhDCh9$4HJYvF59udBa4AlsJc z02~QZ9Ef$XR!PvDZV*{)HJ-CY|$;Gp>X0VD%w25ah3+sQ+~e z$tY`WrBy%%9(&Itqa*xH6?W85kWE;}9P(yDRkv_;+R^vAkYQ&%H+8-=R!(04RPWjh zbmL`R-yg-!v(Har$bG`QuE&JCUYJEI^)8X+T@>)%A?@Mcp^fo@TvZT~Sxm(tG8g3l z+I~==JVLq450KXjKF#@RsmK2L^od z5m|b)*fR)(>1hjaA1)JPr{!PdH?U3744VAjo53^k-}HF?x+|33&M+EuSHyG@Tg_{d zQfvN}btvQ7bu3^@NuLw-Fr+@?t`l(SzvE>^SZ@-Hy*|p1$)OsgNC|GdsX#kA^dRGQ zk7JGRmb_z_3bm-M`rO^s|Bi9J$A0lf*d-%@N8YhA)8&reU3rxN4q7)uneHaG;esln ziHW?PEgeMFCflN_S;l1xmM@iaTR(k`1$f4prh62V{?*QKV5r|6+d_6jfKoubumyFD zM4L+@>g23p234NHDi}vmRkL-a_!Nn^roH!es8POgOJA{fTLP zml<`VIOArLKl2vfg**0!1=19|fkl)r%eASy&wWopDf8pw_W6?A+urPtEl$0s-1APz zx1**hS#9--E!=R1{5I-e0L7G<8p5xK%fI%2LVj4)sq5RMOLOKAo@OxR)y(gkw$@amJbA?Jw+0_0wGQs zIKS$;Lzq0jJdnLuYhU+}(BGD6hRqDPF1Q@EQO9z+lu32#N@!G8G zuuKmnHJZv!U?p2->c<%avfaHF!Us}0(HB89cFtDBoqauu1EB%q@#}o-E8BuUJcWOD zYK$Y^tfeXceGOBu`VPo{inZ~)EiXj4;SLL=Kag4inVxoh4Ol8{!eVR+#r|CLkJ@1WmjuDS31B`Y&Cp* zgH=iOl23<)YOg+L4i|jWEg2S=_uEgep_k&pmf6BP^PJJ$YjRIpo9_s|maOxW!(8fc zzJw%7Z&@qXt25rngg;Gg3oDL6{4?JQP$QImHYaF>Q0yIE4z0igaem$T)YXLqgFm5_XCHXeW>^fGgF8D1;tRhg)QErYRe#T(PM?9%-nmr< z=G6D;Who62J`)hG#S*rg95Za89tG*j4i~L(`;PZYJD-8m`hH*fj--FzXqdb{!sy3* zKUM_n;c%3I%V%lA`YhP_zxn@5Xa=Z$L3{jbli-2=O9}jMVcyWd$^3ueGjmk-?3Nf1 ze06^#iREXPO?V2EZDp*5kds2$+%w5ex!P8y8;Y8QwNk$CvUAvIfk}pwa=Pw%ziz{d zu0|F8S>MIzXq@jQYD1?xp`=;YNQN{+(Fw`0aPjd5Wvv7Q^NJYrwRNPmQ0;d@OJVbQSvm)x z0)rUD-NhQs$rzk!YP^Gu=Dzlo`h@|*#)!4aRO4z?6~U*A^Ta6&!Bgl%c1?PSyTT}| zyS~{0s>Q*B3rd{1>l;Ur8YQw~KDvbJB-jxrPWhLU6kwB9Fyg&4u(Y)2dJCWodqi!f z+X9+>kUlV$4XwK5ju*rA5ICJZjLEE{wH+>3JwL)Jwe%FbCHoqo>?0~+DM)xf7{|q! zeKZ^^^4fhikG6KI<&+Y@CpGcY^o!^w4jAPKmHeOU$+yWxlOQ;Ed44EzX+?U^S4YFIUmu6YrmCu}gW#ux#I9+XrJeqaS9ZR~vT0l3&l5$^bZ{<( zIwPlHXrj6G*lP=r1{udIka{n$b#oFYRwZY1&j|==LZ|eFixvKcJjWx$} z`Hze+9O9`2+FW5GeeXvdj4hAB7+uZG=RgR0{X`BXJK!ZX_83D7AC?62{7TD1TD{@^ zmeg#KkM#vW6N#Hh0oIi&yYq%Z1uci-FJ-1_g}qfY`@kBNZ**<3b6~C3U!^r2y$z(< zJ|q8k6SFy&6YLQH0OZ>O03iQ&6FYm@oBVIRr5>HDf5JbPzp{Ly=!uU&S_I9mmD+F; z0SAsPXf-Lr@!K!(sZe0({51BZ zW%OshH!*2dH1sMCeT$bxT(gTpd#IO!Gmq94T)zcH+GR@|8(lMxR!@eF`auek#dBeuBVteeaovgTuYiWSu#Z%?}^{?7`nS z;)kA;eRaX7jL4UE>si-zRyqBo?awglpBNUb&}f}ihSwt5`y=~YvaI0nEo_L-hV`REA~c1@hHF_kZjmgJ_%z=gi#YY)kKP_ zltaQ&KC6t3{4*-q^{M{8_4#3Zt6>h}xSBSXZWOIhMOaLu+K{a^<8Qp)5XrI36jE;~ zMva%VC`+)W0jrh@!f%9erb3TXa%@yLg#IlU=My()K*>)_wwdM<|+VaDQRo>IQYvHgDf2eT4C zWFm2UFkl!t(_Ann^Vf*w&c@OMJ`1b5lyIv(oqHnaQyejga;j!Mdgw{k74Wm?T2p>L zFGlZUiXUU;gaa^j+#pnGRU%2@aH8_HGhBq4F01i|f4ekA7CRmhbE};Kr{l8vB5Th9 zZme)^{!&e;M}-q?TcCUU9}P&lKO4o}ABE&<*D+zq+)eR|%@L6s-NVDe<#h-rkJnZo zxq&30_ePjH^U!FgWT-D3d*+&nI6n&}42@Tq8!UYX8|`G=XyJ;x*ckGh0UZGZ2Z7{4pn9 zgN#3h0)cLgJ+vBnaLgigIO)qL5bZ-fm{AmrsN#$w;v#Hf{8@znjX6pZUi@$TGiO6X zuQFLKvaN(;$Y;76mdsq%3gxuhX68RvM$-Z=*hu|i^{)VpyN{wnt~VyRiT@sn z_X#HE`c(;r*@O20|Lr$D(Nb)Sr=N&DFdi0RPBqpb1>+*EdzC&D0rmTz23L%7y1O7w zxuh3p!^d<&36GA#RI8(QM8~GtfF3gN-9-d@TxW6up>&tt5M&a6YluJtRHElh8HvW@ zXOslIqxeAz!Vl&sWLzZB2%)C&M2m>x9IG02Gta^0BmCOL7aq9{-YnyfX93f5uPm!R z#0-01ByHo*K$Sojf@$`WXCkJY5vP=4_RXQraW$#|&Cf_v6m`tGvWAb87v}Jp>s8f< zIkB@sMLjN|@8V8Dg{Z$U#JW8M>x0PO8ZsUFI1@tn93A4JEcKSb1sn`c`co*gt8Bkg2SfwMJ3%QWA=!}3eBNL$n zQOZKoZ*L~!q);+L1b>C@+fSE>)G8!666k;k1az%o8>W~>!B3ge--q1S0?;ju8fOtn zmF}ZHi{*&gTknGqAy?L~{MY-<6A_?gJJl0vm)K&3tByl9)RRP*1D+sCEjcvn7qk4! z*a?TAeb4J(H0bel{2{N|6)aC4=Zg|4vVm3Hp$g4OL0n20vwD}3SS4fl)@PL97L-64 zsD;u)A-uZt#9YY2=NGy6Q=MJ*8WtIXO?YYv%RcHxbU+rBU7LI3e)QNo`XYG7_Ig93y}M) z)m0Yl`Ml}v`Gkf2MZm}Z>=G0yZZs&M@7jQBm=L4w04=5K9`zlW{b}=E8UDdtt;22? ze(~B(_dI7mZ;|r*0n1_A)%rAkhfwrY2?_ewn1n?U36bQaZ z@=N#PNu;yn%1&tr9cVY$Zqj%gvnHyp@g^mv2HGa@-*=gneD8NMnF_T2Y0yA1O0?xP zJZT~!@_708Ej9I-%(4^a$^JIDf-_QAge0O{WLC9AApYGh3qY_Yx$!lzl0%<2)Y}={ zLq#SlA=Wh}uP3t+_}w=PCh6k;!iY0bb}8=^A?1G)m}b}HQDx&>e`l7p+6w*6sk~ov0#6b#(3uyGG_A|8-?D%H@2cNr> zkgQbw`fzu21c(xwI!MJ0M?`k4CltvUTtH+MregFs?5~Y#+4wRyt zP(LUF4L&+RQU#Bxh4U%)ePAE}+*ex4LUV`~2XIG~MT^w|w3nI66MO0)!9yF2W-8XGL$X@GjVc;B3;pQ2 z$3Ll_8b67wJ&@3!gq+yG5HzI;^Z>YF%roWjw<$qP3p~iK(H|-K#zr)p9Zq1uy9Uzy z-of51+m|qJp!TnPnk9$s_qX@DWZ&&?39!F@caTArl9NjAX2j2j$bWfY*pBPq`Cuq) zBM+_x4>Rdn*D773C#LROSSY`w_|eB@B-|m-At9k_Bfb7;{Ej-m3CcT9e0UC^c#3(9 zi2KK>`gTWi7=y~;PZtiKx1M)ce~7CQfsZwH<%}pwh zBjX2zz)LW`8h2BHF8sT}6_5`MmB&sJdE8H#KUR#$jeW$9ms&Q=1CFtB#^KPwmKgSg z_{mgHL)I(ueDY>v$>kFG!wh%n?a70w*5t|RWU5g^;a=`N*6VrEByCvD1@ej+)6bs> zRj`C8P{NhZ=-8jUEZ81HSqU;1^zN0-?1gA7e-6*b^J5hktLJ?0!{ql}ZjkRfjLVwR z!fC5GN>6f&XsyyPH1z@WXxLQT=|rS5Yc&(PI=)TLC}n#7wXz!h^FeZm6tmh42I7kW z=TGKNTOp4gw7b)>cpP!Xgpz+p28n4UGJCZWX$%04>*|J-yxA;*R~6CxdV^!T9+!W} zAY<2Xb?zwVn*>ig)>a+1qLc_nuFOH&9X%dYYk#B=o>KiQJ9w=98#3P2c~)z`FltBj zjI&N$^mEB$TC@)hmY^{9sSn`zFCif-bgTVy%iP6(Mv@Q9sx$sd*I7EVPyX;rEy;y9 z%1K$mAc}ChyODbTt-d%f=IS1zi`#zHNWoyWS`gUkphIg#abi`{T^7gEP5fa%BE;Qp z7Yuyynks8|iv{E&%h_Kk${r?q!m5YJ3j|9ADv&5Q;Ygi_gm5Th$h=r?ESnWKDMd6c zn;={iawwUQI7?K@POqEv{ltme$mM{N6D-`5{QY@1%?n0?;yOVyD{`lTb=F-(8_G!P|#UapEgRI&tBa4$TxD>f0n8+ zop?a$iYYd-VQ&!;Gkm8s`(`V#m42%PwqhKv%%e4MS)C}!!)nERFE$E{50cN2Ot6_W z;~#r57VC-j6`oUX#_Ahe0u-{-3Ohpc`}~O-aX)CrMb^KhJRTomS^zva1(~DF8d{7E zFT4iB*N)=rAmf7rmB29)Y$`O18n~azL)HiYrdx9q9Q=b_qn^M2F!4U}?hYe(I8JFebTkS;45E;iCur7xz&%|UEj z9|iu{)qd6G?0*gvTO2HLypRVZs_CQJBoe1j)t(ZIr+G?|{${RXcrgbcM3O>j-AT+t zYN8!{ZSIL&f?T{{uVM%H>fm~KvQ7hbJw615nKa}re;pMJRbV9bWKR^*zG^Rmg(Lf2 z_xEqx?tbnd zBSs}6_pIB?Be3@0}^l_8h_F;`WC!%D9&q0?u8{J$YzSANR;lHo(+5xz(R65`9%!x%@-aDUOrYy@_F$F}Ej za3p+p4vgeh^8h2FtKk zkb1o$vP^ptlimXOb(|r}V4P3G9HL2=druK~A(O2=6SW68aHm2OZfVm?l`}8xOHRn4 zCt>tg7LZ?6A%O1Ax6@_+A~mYai}N(<#Z5ALsX*z+_V$anN(9isBv<$ZLHPU zPg}$V2gw#gDL9`v>Fc-*OW}%}ZLk8(A((TcWUjd;?cfh9{778_aNWQe3#(Z}0s(uT ztT>%KKq>nEFQhJ3q48*)KXJy~KFLY>a}CsLzc>rUI=!e1XzD z1{_B4H@A&r5YQB;N5=)vTTRp_9V~6*RaP z^F)SYj^=Gt%$y3^=t*IM)zQO6m6BsI3F(>o+ZB~2$`uEFJRu%`9zVkjlx5@HU!nYC zzzaGy5o5*WcMWE?aX39nV^@taos7chXD$mf0nM*8G2LQW;MDuBwMZ$}iGy}Drs64Z z7(q_$DC08{j?H%UL1`%fMc10}~q9K8}BC&abDYY)T;Kixea2KO` z3O1SSrN2NjC{Gf7Ou@5K?Pn0xYP6H_(4IsUkOJSKBuz{tNy^8Ly)$M^1UZ_RNhIr> zg}4jTx^MnLX?|jdDVTKJBF+U@iV9iq2f;j@5s&G?{5OaOg^tYC{Mk3gQbu_Y+hPg+ z_T)2eS|c4ZP%Th7sjZddQ>k-^aHN_n#vnt=?o)raC*J`JJRPpJ-^EJ=OKSX$2bNmr zS*BWT3kijCy$2)rA>d3#z`gR*9pjup@Au;5(g%6jB4l?w;xMc1^W+- zr+Gst>qZ2Jmj+|r1xs$-8+UU4*zV8<^$_q#&Kz&mughow zzvTEMs?LbXuuU-8Oy5GF7Eoc1N2m}oF^a@9F-8GKOwKCwlZzGy)g!V|BRG3Tl`H4+ z`9eKZX*|Vk(P}QOUpGMlnm%Q_qTOgSkb1YR=iS^j!?d%8Cx7u7=?C^27I<4G#XzOM{2j>Zz8R5&6h|g(Sul7`L6U7c#f3vUkI9G#dX3^eB z&1Sp}mo@I%&9GT#T!lX&k51chv1;v{uIa<`rKvWGr6MR!1E=ocie4meP9_ykm^#XC z8xIviMS;(=4`fM8V2&2$#0h$6eNz-0Df}KSE*1j^c&jFHZeYkI|T%6 z@fKbNQP+XZwGOBwM%mPxd;|{q-UAdMC=7nc( z^G3SH?n@y2MouUBdW#C5pi*gbd5>+Lw8mEZqIgL<)hoS`m@{yD%|eJO-c%hwd4aaQ zHvl2-vJfLi0N-Pyo*gc19E{^Fo7|RIZYTi625+l`lo3@OZ+w?jHMJE{Q=0+Zfv*ia-nLd> z_LabU$%0yqR$=af7q~T~+*)Zf2{vsuSH;rT(xv(ODJNXI^8hGSQG&b`3qwIIf;x>zxV z5g+G(IKhc0&qZ3|&qA?u;C%-+6dj>8RN5`2Xqb zTEL;)y6{(0I;A9(+;crNBSb|JNx2;isWl4kz#@Qlafeb-)l?RTwjp1t>4U9&<~Pp@8M>_x5bgEm>j)?&O1*IF8cQr6==)5yP|s@#SA9$cF;tsIl^sutRAJL7Y7V`S_D zC(Tn5NqU_l81Fwq%H-;fu_@jtk2HBVPEki!HXWKK)?MV-ZL*Q#m);RKm`>q+m#H8m z7vqK!ljFHt$GJzvyKZw&=_qf)W>+if-N)&8Gj+i+?^27KDl*y;Yn)fsv9BvmS*{}& zcf@$#j{gK$3h)b*SfXMx#YNJ{sZuhZM|Qk<&>Vy}|9$mg)%4wu3B->?`F7K@hPmAW zl!(m!utu9RW#`_4(b<)9^O;xsZz1Mny$Pvm0td-@9D6CjpwG*U43%! z+W{jVSNUp1|3SP*t7#kh$njtu&+??^U+xKT+mZt+-c9%$obu5Y*6%ek$*KR3e`X<# z>vmY0thcfx`(#22kz@zo zh#}#s{PJZR!Y@BMEN@or&o6gjqxNIPSmndlGsZ?#N{b5oLOUNGDj~1hwPjpLPuehZ zjRKE)7e;b$nkV0gSTJFEtGKGxcc1DGWB-nFRNJlU3wN!xYMxK4=3llfp!JWdghz1==`%4uy<^6qCN!D!`|AG1E(F1Vm$?JB~XGcg_GANH`Pw2g<$ zUMbhwv7eCpXAyS*=gUu~J!9hq>9QOlGO&+lBu`zKlXiZqna_3+E{mxo8?g%Wp#$)# z35$3VC-$^euy9ASlquWY{oZ1c*30mmJI!|OY3-_P$>8{1)Q5-8YkYEuPVE0x8+#n&cZpNs*fNCtCD&7Mo{Y*PdF@=3|o3(9mL`;&(*z zeyG}SaT$f`4Ta>0#!vMk^0ukvaB_S=9^7L5w|)MHN&Qa>*&K14?rZOKSQ*k%hV`x9 zS}3W23(N%lD8v60T3)Y8yV-Ch`|dhja|!2Z;u)zXpO)YZ-3DKb$e5NbSKfn<#jhfp zl54i460FtJOLJf6I23c2QMc-y8NKyeaoVF7y$)rLzA=}3h~(DSc&m;6iTTI%@~SrC zg$g}ywR&UlSEjG7Jyvr?!}+Z1P^m|iZ*V}lZcp6{xB4$m z*wRQURgV0%o8F5|ybLYMgU7N{;w`8-XLos77wy0p56Iob=61L4cIrc45}eNUEy`+p ziRYbojtb%6R6uK+mn#()C6|f?{Y0tL71mj=MngN;MVd9wb$OkS-k{1B{rt$JD?wno zws^da%xl=b^0jQ&*1?vN-V(xfHoKeJJlJqTb&)v~!d0VLb=6)(`P|6f&>(`+Cc+)` zx&VID+gBZ-^4&7~WWhotZv7-G4CBXY*KS5cy0d zzo>W+zHnO95iP72o`AY&3eCWmi2WgW55g->v(Dk7)Sk17xPBjvt@=}KL2)io!fXCA zl0E40_d`cv!KsvG;v%D#Vxn03LlF*k2~!O=?sHkIIwR}{>4C;pcZjcNmL1k#wp^GE z^x^=o=MgBIFK@p7SOd;S&%L;y0nOQWUytLWJe1^3P1xs-M=v-Uy%gXE1mFQAARg!D zNc{;c5BL|3FLq{NW69~95JZ=mJ;gm|Cpgp%Wt@mz40g6{$d~O(OBp?nzCpK^v<3V+ zatLgGLZF{qhw#Fj(ax|NOu^7_BsUf~Ov?s7%7e{SWh)^_0KqZ3brBBOjYh$J-L1mh zAjn?w_eHlrPzspTEeHZ{$wdfAG#8jMw;P5z{HRv>$xmPa{Hqt@4`?ic??k~6S+YOj zMp}>?*m>5qcJ^2};}omzN8p1)`!v{##)9wb-AZ?2faz2KkAxlrGtLm@4kULsN7#`C zXu{O!5Dr-EEe=87;(abKGxZVB6n9plB^nCT6$Fm<ZoSZ&~dpnt&ZA(3x~A&`kMkwo$SY0NDy+FW04hM-x|7C4JQromJi(-ON@K#i>t zT$%5If*?_ZC*Va;DKM7g0neHZIDTsTyuWoHl z7!d5IK~N&60`+1MhA-P1u_PiHN0@6}z?`6S>wumBfMHN)kHQcLXsQddD$(Lzl$!+7(h*Q-@FR?Wi^O-r;9(Sz>GKK{5p3QP0>JNppcFy4iF4xsn`M$&pVIKRmnx@|Z1{Bjl*=OZ|Xw2MSC1 zwymGJQQ7o8fvG^3IKaq|b#jl~4@eYHSQiW{2_k%L_la^)P+@^yAXjsqJc5IYb%7n- z2{46)x&PZ+z_=S^A3lSHB}(NU1i0x@&4a8Y`}m~52|SPpU+|5z`n?qbn2f>VfsUf* zuAExR?TarqWWLX_Mu1aYa73o_y?*K-xdE6P11c-zBh}a(AW9Sw z9&}@x%M(YNy^oBg=h#0&Qxo|>`PmDeink+p)t)jtMhunePGsphv<@pKt^?BM9+26P zF!WL1NyN1VjP)FCW>dssI20 literal 0 HcmV?d00001 diff --git a/packages/agent/docs/pico/v3/plugins.md b/packages/agent/docs/pico/v3/plugins.md new file mode 100644 index 000000000..1b47cc613 --- /dev/null +++ b/packages/agent/docs/pico/v3/plugins.md @@ -0,0 +1,523 @@ +# Pico3 plugins + +Status: proposal for how the hardened V3 (`pico3`) harness is extended, and how +those extensions are packaged as Chord facets in the coding agent. Companion of +`view-and-events.md`. Written against `harness-v3.zip`, `pico-handoff-v2.md` +(§8–§12, §16) and `packages/agent/docs/plugins.md` (the coding-agent facet +architecture), read in full. + +Read order: §1–§5 are the harness alone (no Chord); §6 is the Chord layer; §7 tests. + +## 1. Principles + +1. **There is no plugin object.** The harness exposes registration capabilities; + whoever composes the process (a Chord facet, a test, a script) calls them. + The coding agent's "plugin" is a package of host-specific Chord facets that + call these capabilities (§6); the harness never sees the package. +2. **One durability story.** Everything durable is one of four primitives (§2): + entry, task checkpoint, task slot, namespace slice. Tools, hooks and custom + task kinds use the same four; none has a private mechanism. +3. **Nothing durable belongs to a facet.** Chord service instances and + replicated state are live process state; a reload replaces code, never state. +4. **Core authority stays core.** Extensions cannot append entries mid-turn, + touch `turn`/`inbox`, resolve inputs, create core tasks, or write outside their + namespace or their own task's slot. Enforced at runtime on every method, by + type at the surface. +5. **Everything an extension does is visible through the view** (`plugins[ns]`, + `tasks[id]`, `turn.tools[i]`, entries) and nowhere else. + +## 2. Durable primitives + +| primitive | lives in | lifetime | written by | forks / history | in the view | +|---|---|---|---|---|---| +| **entry** | transcript | forever, immutable | anyone via `c.write` (boundary-safe); core via `appendEntry` | inherited up to the fork point; rewind = `at` | `entries` | +| **task checkpoint** | task record | the task | its kind, whole replacement | no | via `describe()` → `turn.generation`, `compaction`, `tasks[id].status` | +| **task slot** | sticky document, `tasks[id]` (turn tasks: `turn.tools[i]`) | the task; retired atomically with its terminal record | its kind; tools running in it; hooks running in it | no | `tasks[id]`, `turn.tools[i]` | +| **namespace slice** | `plugins[ns]` in the session, rewindable or sticky document | the conversation / session | holders of the namespace token | rewindable slices are inherited and rewindable; sticky/session are present-only | `plugins[ns]` | + +Rules: + +- **Checkpoint** is the kind's recovery program counter, nothing else. It is not + a place for working state (that is the slot) or long-lived state (namespace). +- **Slot** is working state that should die with the task: progress, streamed + output, and **memos**. `memoOnce(slot, name, candidate)` is one operation: + `slot.memos[name] ??= candidate` inside one commit; it returns the durable + winner to every caller. It is the pico3 equivalent of the lane harness's + invocation memo and of Codex's item completion record. +- **Namespace slice** defaults are declared at registration, per document, and + seeded lazily (`plugins[ns] ??= defaults` on first access). Choose the + document by semantics: rewindable when a fork should see the value as it was + (plan mode, chosen model overrides), sticky for the present (UI preferences, + caches), session for session-wide. +- **Entries** are the only primitive the model can see (when they carry + `model`); everything else is invisible to the model by construction. +- Protected: `turn`, `inbox`, core config keys and other tasks' slots reject + writes from extensions. + +What is deliberately **not** durable: Chord keyed service instances (an open +approval dialog), hook handler registrations, tool and section registrations. +All are re-established by code at startup or reload. + +## 3. Registration surface + +```ts +const h = await Harness.open(storage, { models, processHost?, onReport? }, ctx); +// nothing runs yet; register, then: +h.resume(); +``` + +All registration methods return an unregister function and may be called while +the harness is open (§5 for what happens then). + +```ts +h.registerTool(declaration: ToolDeclaration): () => void +h.registerSection(section: SystemSection): () => void +h.registerTaskKind(kind: Kind): () => void // ordinary kinds only; config keys checked for collisions +h.namespace(ns: string, defaults: T): Namespace // token; unique, not `pi.*` +h.hooks(kind, handlers: Partial>, opts?): () => void // harness-wide +c.hooks(kind, handlers, { subtree? }): () => void // one conversation (+ owned) +defineEntry(kind: string): EntryKind // stateless; no registration +h.conversation(id, ctx): Promise +h.hold(): () => void // §5 +``` + +Token identity: the object passed to `tx.plugins(ns)`, `tx.emit(ns, …)`, +`tx.createTask(kind, …)`, `h.hooks(kind, …)` must be the currently registered +one; a redeclared or unregistered token rejects with `StaleDefinition`. This is +what makes reload safe: code from a retired generation cannot keep writing. + +Before `resume()`: task kinds whose tasks may exist in storage, and hook +handlers that recovery reruns (`beforeTool`, `systemInstructions`, +`beforeRequest`, `beforeCollapse`). A task whose kind is unregistered at +`resume()` is orphaned (open-time reconciliation, `pico-handoff-v2.md` §13). A +kind registered later only affects tasks created later. Tools, sections, +namespaces and observer hooks may be registered at any time. + +Inside a commit, extensions get: + +```ts +tx.plugins(ns): T // typed slice in the declared document(s), tracked proxy +tx.emit(ns, name: string, data: JsonValue): void // -> { type: `plugin.${ns}.${name}`, data } in this commit's envelope +tx.slot(task): Slot // own task only (kinds); tools/hooks use api/info variants +memoOnce(tx.slot(task), name, candidate) // first writer wins +tx.write(conversationId, entryKind, input): Promise +tx.createTask(kind, input, opts): TaskRef // ordinary kinds +``` + +## 4. Extension points + +Each with what it may do, where its durable state lives, and a worked example +against the raw harness. The three examples are the ones §6 turns into Chord +facets. + +### 4.1 Tools + +`ToolDeclaration` as in the sketch (`name`, `description`, `parameters` TypeBox, +`replay`, `output` bounds, `execute(args: Static

, api, ctx)`), plus the +tool-facing API: + +```ts +interface ToolApi { + readonly taskId: Id; readonly conversationId: Id; readonly callId: string; + stream(chunk: string | Uint8Array): void; // kernel-bounded; becomes the result content if none returned + progress(update: (slot: ToolSlot) => void, ctx): Promise; // own slot: progress, details, continuedBy + memo(name: string, candidate: T, ctx): Promise; // memoOnce on the own slot + memo(name: string, ctx): Promise; // read + task(kind: K, input: InputOf, opts, ctx): Promise>; + conversation(spec, ctx): Promise; + waitForTask(ref, ctx): Promise>; + slot(ref, ctx): Promise; // another task's slot, read-only snapshot +} +``` + +Durability: the tool's **slot** (`turn.tools[i]`) for streamed output, progress +and memos; **entries** through its result. A tool has no checkpoint; it runs +inside `pi.tool`, whose `started{call}` checkpoint is the effect evidence. + +How memos and `replay` interact: `beforeTool` and the `started` checkpoint +happen before `execute`; a crash after `started` re-invokes only `replay: +"safe"` tools. A safe tool that performed a keyed external effect records the +key or result as a memo *before* the effect and reads it first on re-invocation, +so the effect is not repeated. The memo is retired with the task, so it cannot +leak into a later call with the same id. + +Example: a question tool that waits for a human. `ask` is whatever the host +wires in (§6.2 wires a Chord dialog service; a test wires a promise). + +```ts +export function questionTool(ask: (req: QuestionRequest, api: ToolApi, ctx: Context) => Promise): ToolDeclaration { + return { + name: "question", description: "Ask the user a question and wait for the answer.", + parameters: QuestionParamsSchema, replay: "safe", + async execute(params, api, ctx) { + let response = await api.memo("answer", ctx); // answered before a crash? + if (response === undefined) { + const candidate = await ask(params, api, ctx); // may wait for a long time; abort unwinds through ctx + response = await api.memo("answer", candidate, ctx); // first writer wins + } + return response.outcome === "cancelled" + ? { content: [{ type: "text", text: "User cancelled" }], isError: true } + : { content: [{ type: "text", text: `User answered: ${response.answer}` }], details: { ...params, answer: response.answer } }; + }, + }; +} +``` + +Crash before the memo: `pi.tool` recovers `started` (safe), re-invokes, no memo, +asks again. Crash after: re-invokes, memo present, returns without asking. +Two answers racing: both call `api.memo("answer", …)`, both receive the winner. + +### 4.2 Hooks + +Declared per kind, typed (`GenerationHooks`, `ToolHooks`, `PostToolsHooks`, +`CollapseHooks`, plus any custom kind's `H`). Handlers receive +`(…payload, api, ctx)`. `HookApi` is identity only; each point's runner passes +a point-specific info object with exactly the capabilities that point can use: + +```ts +interface HookApi { readonly kind: string; readonly taskId: Id; readonly conversationId: Id } + +interface BeforeToolApi extends HookApi { + readonly callId: string; + waiting(on: string): void; // kernel sets turn.tools[i].waitingOn = on until the handler returns (any way) + memo(name: string, candidate: T, ctx: Context): Promise; // memoOnce on the tool task's slot + memo(name: string, ctx: Context): Promise; +} + +interface ToolHooks { + beforeTool(call: ToolCall, api: BeforeToolApi, ctx: Context): { call?: ToolCall; block?: string } | void | Promise<…>; + afterTool(call: ToolCall, result: ToolResult, api: HookApi & { readonly callId: string }, ctx: Context): ToolResult | void | Promise<…>; +} +// generation points: HookApi & { cutoff } / { attempt } as today; collapse: HookApi. A `memo` on another +// point's hosting-task slot is added to that point's info type when a real case needs it, not by default. +``` + +Durability: a hook has no task of its own. State tied to the invocation it is +running in goes in the **hosting task's slot** via the point's `api.memo` +(retired with that task, no cleanup code); state that outlives tasks goes in a +**namespace**. +Hooks commit through `h.conversation(api.conversationId, ctx)` handles and may +wait as long as they like; `beforeTool` handlers rerun after a crash (they run +before `started`) and after withdrawal (§5), which is why their decision must be +a memo. + +Example: tool approval. + +```ts +export function installApproval(h: Harness, ask: (req: ApprovalRequest, ctx: Context) => Promise): () => void { + const policy = h.namespace<{ autoAllow: string[] }>("approval", { sticky: { autoAllow: [] } }); // long-lived: which tools skip approval + + return h.hooks(kinds.tool, { + async beforeTool(call, api, ctx) { + const c = await h.conversation(api.conversationId, ctx); + const auto = await c.commit((tx) => tx.plugins(policy).autoAllow.includes(call.name), ctx); + if (auto) return; + let d = await api.memo("approval", ctx); // decided before a crash / reload? + if (d === undefined) { + api.waiting("approval"); // view: turn.tools[i].waitingOn = "approval"; event tool.waiting + const candidate = await ask({ conversationId: c.id, callId: call.id, taskId: api.taskId, name: call.name, args: call.arguments }, ctx); + d = await api.memo("approval", candidate, ctx); // first writer wins + } + return d.decision === "deny" ? { block: `denied${d.by ? ` by ${d.by}` : ""}` } : undefined; + }, + }); +} +``` + +No `afterTool` cleanup: the memo lives in the tool task's slot and is retired +with it. Late joiners see `waitingOn` in the snapshot. Two clients deciding at +once both get the memo winner. Abort unwinds `ask` through `ctx`; the kernel +clears `waitingOn` when the handler returns for any reason. + +### 4.3 Custom task kinds + +Shape as in the sketch and the hardening handoff: `defineTask({ name, config?, +hooks?, initial, phases, abort, describe? })`, exhaustive phase map, in-flight +phases written before an effect and entered only after reopen, `next` builders +that may checkpoint, terminalize or `"retry"`. + +Durability: + +| need | primitive | +|---|---| +| where to resume after a crash | **checkpoint** (`tx.checkpoint(next)` / returned `next`) | +| progress, partial output, per-run memos | **slot** (`tx.slot(current)`, `memoOnce`) — shown as `tasks[id].status` after `describe()` | +| state that outlives the task, per conversation or session | **namespace** | +| facts for the transcript / model | **entries** via `tx.write` (placed at a boundary when busy) | + +`describe(task): JsonValue` turns checkpoint + slot into the rendering-shaped +status the view publishes; if omitted, the view shows `{ phase }`. + +Example: a background repository indexer, resumable and observable. + +```ts +type IndexInput = { root: string }; +type IndexCheckpoint = { phase: "scanning"; cursor: string | null } | { phase: "writing"; batchKey: string }; +type IndexSlot = { files: number; lastFile?: string; memos?: Record }; + +export const indexer = defineTask({ + name: "repo.indexer", + config: { rewindable: { indexIgnore: [] as string[] } }, + describe: (task) => ({ stage: task.checkpoint?.phase ?? "starting", files: task.slot?.files ?? 0 }), + + async initial(task, rt, ctx) { + await rt.commit((tx) => { tx.slot(task).files = 0; tx.checkpoint({ phase: "scanning", cursor: null }); }, ctx); + return scan(task, null, rt, ctx); + }, + phases: { + scanning: (task, rt, ctx) => scan(task, task.checkpoint.cursor, rt, ctx), + // in-flight: only entered after a crash. The batch key is the memo that tells us whether the write landed. + async writing(task, rt, ctx) { + const done = await rt.commit((tx) => tx.slot(task).memos?.[task.checkpoint.batchKey], ctx); + if (done === undefined) await writeBatch(task.checkpoint.batchKey, ctx); // idempotent by key + return { next: { phase: "scanning", cursor: task.checkpoint.batchKey } }; + }, + }, + async abort() { return () => null; }, +}); + +async function scan(task, cursor, rt, ctx) { + const ignore = (await rt.rewindable(task.conversationId, ctx)).indexIgnore; + const batch = await nextBatch(task.input.root, cursor, ignore, ctx); + if (batch === undefined) { + return { done: async (tx, current) => { + await tx.write(current.conversationId, entries.notice, { model: [{ role: "user", content: `Indexed ${tx.slot(current).files} files.`, timestamp: rt.now() }] }); + return { status: "completed", result: { files: tx.slot(current).files } }; + } }; + } + await rt.commit((tx) => tx.checkpoint({ phase: "writing", batchKey: batch.key }), ctx); // before the effect + await writeBatch(batch.key, ctx); + return { next: (tx, current) => { + const s = tx.slot(current); s.files += batch.files.length; s.lastFile = batch.files.at(-1); + (s.memos ??= {})[batch.key] = true; // effect evidence + return { phase: "scanning", cursor: batch.key }; + } }; +} +``` + +Registered with `h.registerTaskKind(indexer)` before `resume()`; started with +`c.commit((tx) => tx.createTask(indexer, { root }, { background: true }), ctx)` +or from a tool via `api.task(indexer, …)`. The view shows +`tasks[id] = { kind: "repo.indexer", background: true, status: { stage, files } }`; +a UI renders it from that alone. + +### 4.4 Custom entries + +```ts +interface CiEntry extends Entry { kind: "ci.result"; data: { run: number; ok: boolean }; model: [UserMessage] } +const ci = defineEntry("ci.result"); + +await c.write(ci, { data: { run: 812, ok: false }, model: [{ role: "user", content: "CI run 812 failed.", timestamp: now }] }, ctx); +const last = await c.commit((tx) => tx.newestEntry(c.id, ci), ctx); // CiEntry | undefined +for (const e of view.entries) if (ci.is(e)) render(e.data.run); +``` + +Omit `model` for bookkeeping the model must not see. `head` and `edits` are +core-only. Placement is boundary-safe: immediately when idle, otherwise at the +next boundary (`view-and-events.md` §6.1). + +### 4.5 Namespaces + +```ts +const ns = h.namespace<{ planMode: { enabled: boolean } }>("plan", { rewindable: { planMode: { enabled: false } } }); +await c.commit((tx) => { tx.plugins(ns).planMode.enabled = true; tx.emit(ns, "toggled", { enabled: true }); }, ctx); +// view: plugins.plan.planMode; envelope: ["s", ["plugins","plan","planMode","enabled"], true] + { type: "plugin.plan.toggled", data } +``` + +Defaults are per document; a slice may span documents (`{ rewindable: …, sticky: +… }`) and `tx.plugins(ns)` returns the merged typed object with each key routed +to its document (same mechanism as core `config`). Re-registering with changed +defaults adds new keys lazily and leaves removed keys as inert stored data. + +### 4.6 Owned conversations and jobs + +Subagents (`api.conversation`) and processes (`pi.job` via `api.task(kinds.job, …)`) +are core features with their own durability; extensions use them, they do not +extend them. See `pico-handoff-v2.md` §8, §10.5 and the hardening handoff §15. + +## 5. Unregister, re-register, reload + +Every registration can be undone and redone while the harness is open. What +happens to in-flight work: + +| contribution | on unregister | on re-register | +|---|---|---| +| namespace | token stale; `tx.plugins`/`tx.emit` with it reject | new token for the same `ns`; stored state untouched; new defaults seeded lazily | +| hooks | removed from chains; a **running** handler is cancelled through its registration ctx and the chain re-runs from the start with current handlers (`beforeTool`: safe, it precedes `started`; observers: skipped) | joins the chain | +| task kind | pending tasks of the kind are not dispatched (not orphaned; orphaning is open-time only); running invocations keep the kind object they captured | pending tasks dispatch with the new implementation; config keys re-checked | +| tool / section | revision bump; in-flight invocations keep their captured declaration; preparation snapshots retry | same | +| entry kind | nothing | nothing | + +Handler withdrawal is what makes a reload of the approval feature safe: the old +handler's `ask` promise can never settle once its dialog is gone, so the kernel +cancels it and re-runs `beforeTool`; the new handler asks again through the new +dialog, or finds the memo if a decision had already landed. + +`h.hold(): () => void` defers *starting* new hook chains and new task dispatch +until released; commits, streaming and running invocations continue. The +reload sequence a host must follow: + +```text +release = h.hold() + deactivate old facets → their env.own() disposals unregister + activate new facets → onActivate re-registers (same ns / kind names, new tokens) +release() +``` + +Registration therefore belongs in `onActivate`, not `setup`: during a +shape-preserving reload the replacement's `setup` runs before the old facet is +deactivated, and two live registrations of one namespace would collide. + +## 6. The Chord layer + +The coding agent composes the harness and its extensions as Chord facets +(`packages/agent/docs/plugins.md`). Nothing in §1–§5 changes; this section only +says which facet calls what. + +### 6.1 Built-in facets (plumbing) + +Provided once by the coding agent, consumed by every feature: + +```ts +// session worker +export const Harness = defineService("pi.harness", { local: true }); // the in-process handle from §3; never remote +export const ConversationService = defineService<{ // keyed by conversation id; remote + view: ReplicatedState; // view-and-events.md; one publish per commit, on the line + send(input: SendInput, ctx): Promise; write(entry: NewEntry, ctx): Promise; + inputAbort(id: Id, ctx): Promise<"aborted" | "already_placed" | "not_found">; + configSet(patch: Partial, ctx): Promise; + abort(ctx): Promise; reset(handoff: string | undefined, ctx): Promise; collapse(instructions: string | undefined, ctx): Promise; + fork(at: Id | "start", spec: ForkSpec, ctx): Promise; entries(scan: EntryScan, ctx): Promise; +}>("pi.conversation"); + +export const harnessSessionFacet = defineFacet({ + id: "@pi/harness", + setup(env) { + const conversations = env.provideMany(ConversationService); + const handle = createHarnessHandle(); // wraps Harness.open/resume/hold and the registration surface + env.provide(Harness, handle); + env.onActivate(async () => { + await handle.open(storage, { models, processHost }, ctx); + handle.onConversation((c) => { // existing at open, and every fork/subagent created later + const view = env.replicatedState(c.snapshot()); // built on the line + c.attachView(view); // kernel mutates view.state and calls view.publish(ctx) on the line after each commit + env.own(conversations.spawn(String(c.id), { view, send: (i, cx) => c.send(i, cx).then((r) => r.id), /* … */ })); + }); + }); + // resume() is called by the session worker after the facet host reports activation complete (all registrations done) + }, +}); +``` + +`ConversationView` gains `commit: { seq, events }` so events ride inside the +replicated member (one Chord sequence = one commit); a subscriber reads +`value.commit.events` after each delivery. Chord's subscription snapshot gives +late joiners the member at its current sequence, so §9 of `view-and-events.md` +is implemented by Chord, not by us. + +### 6.2 A feature: contract + session facet + presentation facet + +The rule from `plugins.md`: one shared contract module, one facet per host, +connected by service IDs. The session facet calls §3; the presentation facet +observes services and the view. Facets keep **no durable state**: everything +durable is in the harness through §2, and keyed service instances are channels. + +**Approval** (hook + dialog service): + +```ts +// contract.ts +export interface ApprovalRequest { conversationId: Id; callId: string; taskId: Id; name: string; args: JsonValue } +export type ApprovalDecision = { decision: "allow" | "deny"; by?: string }; +export interface ApprovalDialog { readonly request: ReplicatedState; decide(d: ApprovalDecision, ctx: Context): Promise } +export const ApprovalDialogs = defineService("pi.approval-dialog"); // keyed `${conversationId}:${callId}` + +// session.ts +export const approvalSessionFacet = defineFacet({ + id: "@pi/approval", + setup(env) { + const harness = env.use(Harness); + const dialogs = env.provideMany(ApprovalDialogs); + env.onActivate(() => { + env.own(installApproval(harness, (req, ctx) => { // §4.2, unchanged + const completion = Promise.withResolvers(); + const close = dialogs.spawn(`${req.conversationId}:${req.callId}`, { + request: env.replicatedState(req), + async decide(d, _ctx) { completion.resolve(d); }, + }); + return awaitAbortable(completion.promise, ctx.abortSignal).finally(close); + })); + }); + }, +}); + +// tui.ts +export const approvalTuiFacet = defineFacet({ + id: "@pi/approval", + setup(env) { + const tui = env.use(Tui); + env.observe(ApprovalDialogs, async (dialog, ctx) => { // one task per open instance, incl. hydrated ones + const r = dialog.request.value!; + const modal = await tui.acquireModal(ctx.abortSignal); + try { await dialog.decide({ decision: (await modal.confirm(`Allow ${r.name}?`, pretty(r.args))) ? "allow" : "deny", by: "tui" }, ctx); } + finally { modal.close(); } + }); + }, +}); +``` + +The decision memo (`api.memo("approval", …)`) is written by the hook in the +session worker, so `decide` only resolves the local promise; the first-writer +rule is applied where the durability is. A second client's `decide` resolves an +already-resolved promise: harmless. + +**Question tool** (tool + dialog service): identical shape with `questionTool` +from §4.1 as the session contribution (`harness.registerTool(questionTool(ask))`) +and `ToolApi.memo` instead of `BeforeToolApi.memo`. This is the `packages/agent/docs/plugins.md` +question example with `memoOnce` replaced by the slot memo. + +**Indexer** (custom kind, no service of its own): + +```ts +// session.ts +export const indexerSessionFacet = defineFacet({ + id: "@pi/indexer", + setup(env) { + const harness = env.use(Harness); + env.onActivate(() => { env.own(harness.registerTaskKind(indexer)); }); // before resume(): tasks may exist in storage + }, +}); +// tui.ts: nothing to provide; render view.tasks[id].status for kind "repo.indexer" from ConversationService.view, +// and offer a /index slash command that calls conversation.commit-equivalent RPC (or a tiny IndexerService.start method). +``` + +### 6.3 What the session worker does at reload + +```text +release = harness.hold() +FacetHost.reload(candidates) // old facets' env.own() disposals unregister; new onActivate re-registers +release() +``` + +Nothing else. Durable state, running tasks and open conversations are +untouched; withdrawn hook handlers are re-run per §5. + +## 7. Tests the hardening must include + +- Memo: two concurrent `api.memo` writers receive the same winner; a crash after + the memo skips `ask`; before it re-asks; the memo is gone after the tool task + terminalizes. +- Hooks: `BeforeToolApi.waiting` sets/clears `waitingOn` (also on throw and abort); + withdrawal cancels a waiting `beforeTool` and re-runs the chain; the decision + memo survives a crash between `waiting` and `started`. +- Custom kind: crash in the in-flight phase re-enters it; batch memo prevents a + duplicate write; `describe()` output appears in `tasks[id].status`; + unregistered kind leaves pending tasks pending and orphans only at open. +- Namespaces: writes outside `plugins[ns]` reject; stale token rejects; + re-register keeps values and seeds new defaults; rewindable slice is inherited + by a fork and readable at an entry. +- Reload: `hold()` defers dispatch and hook chains but not commits; the + hold/reload/release sequence with the approval facet lets a pending call be + approved through the new generation. +- Chord: loopback facet tests for approval and question (session + presentation + fixtures), late-joiner hydration of an open dialog instance, and + `ConversationService.view` sequence equals commit sequence. diff --git a/packages/agent/docs/pico/v3/view-and-events.md b/packages/agent/docs/pico/v3/view-and-events.md new file mode 100644 index 000000000..972e45219 --- /dev/null +++ b/packages/agent/docs/pico/v3/view-and-events.md @@ -0,0 +1,489 @@ +# Pico3 view and events + +Status: proposal for the hardened V3 (`pico3`) watch protocol. Replaces the +`ConversationView { entries, tasks, rewindable, sticky }` shape and the per-channel +delta of the V3 sketch. Written against `harness-v3.zip` and the Codex app-server +protocol (`codex-rs/app-server-protocol/src/protocol/v2/*`), read in full. +Companion: `plugins.md` (harness extension surface, durability, Chord facets). + +## 1. Principles + +1. **One snapshot, then one envelope per commit.** A watch captures the view and + subscribes in one line operation; every later commit that touches the + conversation produces exactly one envelope, delivered in commit-`Seq` order. + No cursor, replay or acknowledgement: a gap means "open a fresh watch". +2. **Ops are the truth, events are annotations.** The envelope carries Chord ops + that transform the view document, and named events the kernel attaches because + it produced those ops and knows why. A client that folds only ops is never + wrong. A client that consumes only events never scans the view. +3. **Path = event.** Every field of the view has a stable path, so an op on that + path is a typed notification. Nothing in the view is ever discovered by + diffing. +4. **The view is rendering-shaped, not kernel-shaped.** No task records, no + checkpoints, no documents. In-progress work is described by the kind that owns + it, in the shape a renderer wants. +5. **Atomic by construction.** Everything a commit changes lands in one envelope: + the assistant entry, the cleared streaming slot, the resolved inputs and the + `turn.ended` event are never observable separately. This is the one property + Codex's protocol lacks (`item/completed` and `turn/completed` are separate + messages). + +## 2. The view document + +One JSON document per conversation. The kernel keeps a Chord tracker for it per +watched conversation, mutates it through the proxy after each commit, and +`flush()`es the ops into the envelope. Clients fold with `applyImmutable`. + +```ts +interface ConversationView { + conversation: { id: Id; parent?: { conversationId: Id; at: Id }; owner?: Id }; + + /** Active transcript: newest head H, then every fork-visible entry with id >= H.head, + * chronological. All fork-visible entries when there is no head. See §2.1. */ + entries: Entry[]; + + /** Resolved configuration, flat: every built-in and registered kind's declared keys, + * defaults applied. `model` is the only optional built-in. */ + config: { + model?: ModelRef; thinkingLevel: ThinkingLevel; selectedTools: string[]; profile: string; + threshold: number; keepRecent: number; + retry: RetryPolicy; steeringMode: QueueMode; followUpMode: QueueMode; + [pluginKindKey: string]: JsonValue; + }; + + /** Queued steer / followUp / passive writes, admission order. */ + inbox: QueuedInput[]; + + /** Present while an input group is live (from placement to its end); absent when idle. */ + turn?: TurnView; + + /** Present while a pi.collapse task is live. */ + compaction?: { taskId: Id; reason: "threshold" | "manual" | "overflow"; stage: "summarizing" | "retrying"; attempt: number; retryAt?: number }; + + /** Non-turn live tasks (jobs, plugin kinds), described by their kind. Removed on terminal. */ + tasks: { [taskId: string]: { kind: string; background?: true; marked?: true; status: JsonValue } }; + + /** Plugin state slices, by namespace. */ + plugins: { [namespace: string]: JsonValue }; +} + +interface TurnView { + inputs: Id[]; // the input group + generation?: GenerationStatus; // present while a pi.generation is live + message?: AssistantMessage; // streaming assistant message (frames applied in place) + tools: ToolSlot[]; // tool calls of the newest assistant message in this turn, by call index +} + +type GenerationStatus = + | { stage: "preparing" } // before `prepared` + | { stage: "requesting"; attempt: number } // request sent, no frame yet + | { stage: "streaming"; attempt: number } // first frame applied + | { stage: "retrying"; attempt: number; retryAt: number; lastError: string } + | { stage: "deferred"; attempt: number; pollAt: number }; + +interface ToolSlot { + callId: string; name: string; args: JsonValue; + status: "pending" | "running" | "done" | "error" | "aborted"; + waitingOn?: string; // set by the kernel while a beforeTool handler called BeforeToolApi.waiting(on); cleared when it returns + output?: string; // bounded stream so far (api.stream) + progress?: string; details?: JsonValue; + continuedBy?: Id; // background task that took over; see tasks[continuedBy] + entry?: Id; // the pi.tool_result entry once landed + memos?: { [name: string]: JsonValue };// tool/hook memos (plugins.md §2); retired with the task +} +``` + +### 2.1 Active transcript + +- `H` = newest fork-visible entry with a `head`; `from` = `H.head`. +- `entries` = every fork-visible entry with `id >= from`, chronological. Inherited + parent entries are included when `from` points into a parent. +- Older head entries inside the range stay (a renderer may mark them). Display-only + entries (`pi.assistant` with `stopReason` `error`/`aborted`, `pi.usage`, model-less + plugin entries) stay. `edits` are carried verbatim; the view is the transcript, + not the model projection. +- A new head entry truncates: the kernel emits one splice removing everything + before `head` and one appending the entry (§4, `entries`). +- No `limit` anywhere on the public surface; the capture pages internally. + +### 2.2 What is deliberately not in the view + +- `Task` records, checkpoints, outcomes: available through `getTask`/`scanTasks` + for tooling and tests, never pushed. +- The two storage documents (`rewindable`, `sticky`): their split is a fork/history + property; the view flattens their keys into `config`, `inbox`, `turn`, `tasks`, + `plugins`. Which key lives in which document is declared per kind and matters + only to `stateAt(entry)` / `fork(at)`. +- Section seed metadata on conversations. + +## 3. Envelope + +```ts +interface Envelope { + seq: Seq; // commit sequence; strictly increasing per watch + ops: Op[]; // Chord ops over ConversationView (§4) + events: ViewEvent[]; // named annotations for this commit (§5); may be empty +} +``` + +Delivery: folded into the kernel's view tracker on the line, listener called off +the line, one envelope per commit that changed anything visible to this +conversation. A listener throw closes that watch and reports through `onError`. +`stop` is idempotent; nothing is delivered after `stop`. + +Base flush: after the kernel rebases the view tracker (reopen of a cold watch is a +fresh snapshot instead), an envelope may carry `["r", view]` as its only op. +Clients must handle it as "replace everything". Events in that envelope are +still valid. + +## 4. Ops by path + +Chord op vocabulary: `["r", v]` replace root, `["s", path, v]` set, `["d", path]` +delete, `["a", path, str]` string append, `["t", path, n]` string truncate, +`["p", path, index, deleteCount, items]` array splice. + +| path | ops you will see | meaning | +|---|---|---| +| `["entries"]` | `["p", ["entries"], n, 0, [e…]]` | entries appended (always at the end) | +| `["entries"]` | `["p", ["entries"], 0, k, []]` then `["p", …, n, 0, [head]]` | new head: transcript truncated, head entry appended | +| `["config", key]` | `s` / `d` | config changed / reset to default | +| `["inbox"]` | `p` | queued, placed (removed), aborted (removed) | +| `["turn"]` | `["s", ["turn"], {…}]` / `["d", ["turn"]]` | input group started / ended | +| `["turn","generation"]` | `s` / `d` | generation stage changes / generation ended | +| `["turn","message"]` | `s` (first frame), `a`/`s` on content paths, `d` | streaming assistant message | +| `["turn","message","content",i,"text"]` | `a` | text delta | +| `["turn","message","content",i,"arguments"]` | `s` | tool-call arguments materialized at checkpoint/end | +| `["turn","tools"]` | `s` (whole array, with the assistant entry) | tool slots created for a new assistant message | +| `["turn","tools",i,"status"]` | `s` | pending → running → done/error/aborted | +| `["turn","tools",i,"waitingOn"]` | `s` / `d` | a `beforeTool` handler is waiting on a human/service (approval, question); cleared when it returns | +| `["turn","tools",i,"memos",name]` | `s` | a memo was recorded (`api.memo` / hook memo) | +| `["turn","tools",i,"output"]` | `s` | bounded stream flush (whole string; retention may drop the head) | +| `["turn","tools",i,"progress"]`, `[…,"details"]`, `[…,"continuedBy"]` | `s` | `api.progress` | +| `["compaction"]` | `s` / `d` | collapse started / stage changed / ended | +| `["tasks", id]` | `s` / `d` | non-turn task appeared / status changed / terminal | +| `["tasks", id, "status", …]` | any | kind-described status detail (jobs: stdout, exitCode, …) | +| `["plugins", ns, …]` | any | plugin state | + +Rule for kernel authors: mutate the tracked view through its proxy so the +tracker records minimal ops; never rebuild subtrees. Streaming applies each +frame to `turn.message` in place (same reducer as pi-ai's frame reducer). + +## 5. Events + +Events are emitted by core code inside the commit that causes them +(`tx.emit(event)`, core authority). Plugin kinds may emit +`{ type: "plugin..", … }` from their own commits. Every event is +reconstructible from the same envelope's ops; the reverse is not required. + +```ts +type ViewEvent = + // transcript + | { type: "entry.added"; entry: Entry } // one per appended entry, in order + | { type: "head.moved"; entry: Entry } // summary / reset / handoff landed + // input group + | { type: "turn.started"; inputs: Id[] } + | { type: "turn.ended"; inputs: Id[]; status: "done"; answer: Id } + | { type: "turn.ended"; inputs: Id[]; status: "unanswered"; reason: "terminated" | "aborted" | "failed" | "stale"; detail?: string } + | { type: "input.queued"; input: Id; mode: "steer" | "followUp" | "write" } + | { type: "input.placed"; input: Id; entry: Id } + | { type: "input.aborted"; input: Id } + // generation + | { type: "generation.started"; taskId: Id; attempt: number } // request sent + | { type: "generation.retrying"; taskId: Id; attempt: number; retryAt: number; error: string } + | { type: "generation.deferred"; taskId: Id; pollAt: number } + | { type: "generation.completed"; taskId: Id; entry: Id; toolCalls: number } + | { type: "generation.failed"; taskId: Id; reason: "provider" | "overflow" | "retries_exhausted" | "no_model"; detail: string; entry?: Id } + // tools + | { type: "tool.waiting"; taskId: Id; callId: string; on: string } // a beforeTool handler is waiting (approval, question, …) + | { type: "tool.started"; taskId: Id; callId: string; name: string } + | { type: "tool.finished"; taskId: Id; callId: string; entry: Id; isError: boolean; control?: ToolControl } + | { type: "tool.aborted"; taskId: Id; callId: string; entry: Id } + // compaction + | { type: "compaction.started"; taskId: Id; reason: "threshold" | "manual" | "overflow"; through: Id } + | { type: "compaction.retrying"; taskId: Id; attempt: number; retryAt: number; error: string } + | { type: "compaction.finished"; taskId: Id; summary: Id } + | { type: "compaction.failed"; taskId: Id; reason: "stale" | "declined" | "provider" | "retries_exhausted" | "no_model"; detail: string } + // other tasks + | { type: "task.started"; taskId: Id; kind: string; background?: true } + | { type: "task.ended"; taskId: Id; kind: string; outcome: "completed" | "failed" | "aborted" | "orphaned" } + // settings and diagnostics + | { type: "config.changed"; keys: string[] } + | { type: "warning"; source: string; message: string } // hook skipped, tool output truncated, selected tool missing, … + | { type: `plugin.${string}`; data: JsonValue }; +``` + +`warning` is the one event with no state counterpart; it exists for exactly the +occurrences Codex models as `warning` / `error{willRetry}` notifications. + +## 6. Commit-by-commit mapping + +What each kernel moment writes, the ops it produces, and the events attached. +Ops are abbreviated; every row is one atomic envelope. + +### 6.1 Admission + +| moment | ops | events | +|---|---|---| +| `send`, idle | `entries +pi.user`; `turn = { inputs, tools: [] }`; (older queued items placed first: `inbox` splice, `entries +…`) | `input.placed`, `entry.added`, `turn.started` | +| `send`, busy (`steer`/`followUp`) | `inbox +item` | `input.queued` | +| `write`, idle | `entries +entry` (+ head truncation if it carries a head) | `entry.added` (+ `head.moved`) | +| `write`, busy | `inbox +item` | `input.queued{mode:"write"}` | +| `InputHandle.abort` while queued | `inbox -item` | `input.aborted` | +| `config.set` | `config.` set/delete | `config.changed{keys}` | + +### 6.2 Generation + +| moment | ops | events | +|---|---|---| +| task created (successor/replacement) | `turn.generation = { stage: "preparing" }` (turn already present) | `task.started` is **not** emitted for turn kinds | +| `prepared` commit | optional `entries +pi.system`; `turn.tools = []`; `turn.message` deleted; `turn.generation = { stage: "requesting", attempt }` | `entry.added` (system) | +| `requesting` checkpoint | `turn.generation.attempt` | `generation.started` | +| frames (coalesced ≥256 B / 100 ms) | first: `turn.message = partial`, `turn.generation.stage = "streaming"`; then `a`/`s` on content paths | none | +| retry decision | `entries +pi.usage`; `turn.message` deleted; `turn.generation = { stage: "retrying", … }` | `entry.added`, `generation.retrying` | +| deferred | `turn.generation = { stage: "deferred", pollAt }` | `generation.deferred` | +| response with tool calls (closure) | `entries +pi.assistant`; `turn.message` deleted; `turn.generation` deleted; `turn.tools = slots(status:"pending")`; (threshold: `compaction = {…}`) | `entry.added`, `generation.completed{toolCalls:n}`, (`compaction.started`). Slots are `pending`; `tool.started` fires at each tool's `started` checkpoint (§6.3) | +| final answer, no triggers, no continuation (closure) | `entries +pi.assistant`; `turn` deleted; boundary placements (`inbox` splices, `entries +writes`) | `entry.added`, `generation.completed`, `turn.ended{done, answer}`, `input.placed`/`entry.added` for placed writes | +| final answer, `onYield` continuation | `entries +pi.assistant`, `entries +pi.user{continuation}`; `turn.generation = { stage: "preparing" }` | `entry.added`×2, `generation.completed`; **no** `turn.ended` (same group continues) | +| final answer with queued followUp/steer triggers | as "no triggers", then `entries +pi.user`, `turn = { inputs: triggers, tools: [] }`, `turn.generation = { stage:"preparing" }` | `turn.ended{done}`, `input.placed`, `entry.added`, `turn.started` | +| terminal error / aborted-by-provider (closure) | `entries +pi.assistant` (display-only; `model` absent, message in `data`); `turn` deleted | `entry.added`, `generation.failed{provider|retries_exhausted, entry}`, `turn.ended{unanswered, failed}` | +| `no_model`, overflow with nothing collapsible | `turn` deleted; overflow: `entries +pi.notice` (placed immediately: the closing task counts as gone) | `generation.failed`, `turn.ended{unanswered, failed}`, `entry.added` | +| overflow with collapse (closure) | `compaction = { reason: "overflow", … }`; `turn.generation = { stage: "preparing" }` (replacement created `after` collapse) | `generation.failed{overflow}`, `compaction.started`; turn continues | +| abort (fresh abort closure) | optional `entries +pi.assistant` (display-only partial, only if content was streamed); `turn` deleted | (`entry.added`), `turn.ended{unanswered, aborted}` | + +### 6.3 Tool + +| moment | ops | events | +|---|---|---| +| `beforeTool` handler calls `api.waiting(on)` (`BeforeToolApi`, `plugins.md` §4.2) | `turn.tools[i].waitingOn = on` | `tool.waiting{callId, on}` | +| handler returns / is withdrawn | `turn.tools[i].waitingOn` deleted | none | +| `started` checkpoint (after `beforeTool`, before invocation) | `turn.tools[i].status = "running"` | `tool.started` | +| stream flush (≤ every 100 ms) | `turn.tools[i].output = text` | none | +| `api.progress` | `turn.tools[i].{progress,details,continuedBy}` | none | +| result (closure) | `entries +pi.tool_result`; `turn.tools[i].status = done|error`; `turn.tools[i].entry` | `entry.added`, `tool.finished{isError, control}`, (`warning` if truncated) | +| synthetic error before invocation (not offered / missing / invalid / blocked) | same as result with `status: "error"` | `entry.added`, `tool.finished{isError:true}` | +| abort closure | `entries +pi.tool_result(aborted)`; `turn.tools[i].status = "aborted"` | `entry.added`, `tool.aborted` | +| recovery: `started` + unsafe/current-unsafe/schema-invalid | as synthetic error (`interrupted`) | `tool.finished{isError:true}` | + +### 6.4 Post-tools + +| moment | ops | events | +|---|---|---| +| continuation (default) | boundary placements (`inbox` splices, `entries +pi.user` for steer, `+writes`); `turn.inputs += triggers`; `turn.generation = { stage: "preparing" }` | `input.placed`…, `entry.added`…; no turn event | +| synthesized missing results (orphaned/aborted tool) | `entries +pi.tool_result` per missing call | `entry.added`, `warning{source:"post_tools"}` | +| `addTools` | `config.selectedTools` | `config.changed{["selectedTools"]}` | +| `terminate` | `turn` deleted; boundary(final) placements; successor turn if triggers | `turn.ended{done, answer: assistant}`, then as §6.2 "with triggers" | +| `handoff` | `entries` truncated + `+pi.handoff` (head); `turn` deleted; placements; successor turn | `head.moved`, `entry.added`, `turn.ended{done}`, … | +| queued self-head write ended the group | `entries` truncated + `+reset/handoff`; `turn` deleted; earlier queued steer/followUp removed from `inbox` | `head.moved`, `turn.ended{unanswered, terminated}`, `input.aborted`… (stale) | +| abort closure | `turn` deleted | `turn.ended{unanswered, aborted}` | + +### 6.5 Collapse + +| moment | ops | events | +|---|---|---| +| task created | `compaction = { taskId, reason, stage: "summarizing", attempt: 1 }` | `compaction.started{through}` | +| retry | `compaction.stage = "retrying"`, `retryAt` | `compaction.retrying` | +| summary lands (closure) | `entries` truncated to `head` + `+pi.summary`; `compaction` deleted | `head.moved`, `entry.added`, `compaction.finished{summary}` | +| stale / declined / failed | `compaction` deleted | `compaction.failed{reason}` | +| hook-supplied summary | same as "summary lands" without a provider stage | same | + +Manual collapse (`c.collapse`) is `background`; it appears in `compaction` +exactly the same way. `NothingToCollapse` rejects the call and produces no +envelope. + +### 6.6 Jobs and plugin kinds + +| moment | ops | events | +|---|---|---| +| task created | `tasks[id] = { kind, background, status: describe(task) }` | `task.started` | +| checkpoint / slot update | `tasks[id].status…` (job: `stage`, `stdout`, `stderr`, `exitCode`, `occurrence`) | none | +| job notice (`notify: true`) | `entries +pi.notice` (immediately if idle, else via `inbox`) | `entry.added` or `input.queued{write}` | +| terminal | `tasks[id]` deleted | `task.ended{outcome}` | +| marked | `tasks[id].marked = true` | none | + +`describe(task)` is declared on the kind next to its checkpoint union; the +kernel calls it whenever the task record changes and writes the result to +`tasks[id].status`. Turn kinds do not use it: their status lives in `turn`. + +### 6.7 Conversation-level + +| moment | ops | events | +|---|---|---| +| `abort(conversation)` | `inbox` steer/followUp removed; then per-task envelopes as above | `input.aborted`…, then `turn.ended{aborted}` etc. | +| fork created | (new conversation; own watch) | none on the parent | +| owned conversation created by a tool | `turn.tools[i].details` if the tool records it; nothing else on the parent | none | + +## 7. Codex mapping + +For anyone coming from `codex app-server`. + +| Codex | pico3 | +|---|---| +| `Thread` | conversation; `thread/status/changed` ≈ `turn` present/absent (+ `tasks` non-empty for background activity) | +| `Turn { id, items, status, error }` | `turn` (live) + `turn.ended{status}`; items are the entries appended during the group | +| `turn/started`, `turn/completed` | `turn.started`, `turn.ended` (in the same envelope as the last entry, never separate) | +| `ThreadItem::UserMessage` | `pi.user` entry | +| `ThreadItem::AgentMessage` + `item/agentMessage/delta` | `turn.message` (streaming) → `pi.assistant` entry; ops on `["turn","message",…]` | +| `ThreadItem::Reasoning` + deltas | thinking blocks inside `turn.message.content` / the assistant entry | +| `ThreadItem::CommandExecution { status, aggregatedOutput, exitCode }` + `item/commandExecution/outputDelta` | `turn.tools[i]` (`status`, `output`) → `pi.tool_result` entry | +| `ThreadItem::McpToolCall`, `DynamicToolCall`, `FileChange` | same: a tool slot; the tool declaration decides `details` | +| `ThreadItem::SubAgentActivity`, `CollabAgentToolCall` | tool slot with `details`/`continuedBy`; the child is its own conversation/watch | +| `ThreadItem::ContextCompaction` | `compaction` (live) + `pi.summary` entry + `compaction.finished` | +| `error { willRetry: true }` | `generation.retrying` **and** `turn.generation.stage = "retrying"` (visible to late joiners) | +| `error { willRetry: false }` | `generation.failed`, `turn.ended{failed}` | +| `thread/tokenUsage/updated` | `usage` on the assistant entry; `pi.usage` entries for failed attempts | +| `warning`, `deprecationNotice` | `warning` event | +| `thread/queue/changed` | ops on `["inbox"]`, `input.*` events | +| `thread/settings/updated` | ops on `["config",…]`, `config.changed` | +| `thread/resume` (history + `active_turn_snapshot`) | `watch` snapshot: `entries` + `turn` captured atomically with the subscription | +| `thread/items/list`, `thread/turns/list` pagination | `h.entries(scan)` for history beyond the active transcript | +| `process/outputDelta`, `process/exited` | `tasks[id].status` for `pi.job` | +| `item/started` → `item/completed` (same id) | tool: `callId` is stable across the slot and the result entry; assistant: atomic swap, no id needed | + +What pico3 has that Codex does not: atomic multi-field envelopes; retry and +compaction state visible in a snapshot; one replica protocol for state-driven and +event-driven clients. + +What Codex has that pico3 does not: turn-level unified diff (`turn/diff/updated`), +plans, approvals (`waitingOnApproval`). Approvals are a `beforeTool` hook waiting +on user input; the kernel shows that as `turn.tools[i].waitingOn` and the +`tool.waiting` event (see `plugins.md` §4.2 for the approval plugin). + +## 8. Consumption patterns + +Event-driven (imperative UI, third-party client): + +```ts +w.start(({ ops, events }) => { + view = applyImmutable(view, ops); // keep the replica current for lookups + for (const e of events) switch (e.type) { + case "entry.added": transcript.append(e.entry); break; + case "turn.started": status.set("working"); break; + case "turn.ended": status.set(e.status === "done" ? "idle" : `stopped: ${e.reason}`); break; + case "generation.retrying": status.set(`retrying at ${e.retryAt}`); break; + case "compaction.started": banner.show("compacting…"); break; + case "compaction.finished": banner.hide(); break; + case "tool.started": transcript.showRunning(e.callId); break; + case "tool.finished": transcript.settle(e.callId, e.entry); break; + } +}); +``` + +State-driven (React/Solid): `useSelector(v => v.turn?.message)`, +`useSelector(v => v.compaction)`. `applyImmutable` preserves identity of untouched +branches, so selectors are O(1) and no traversal happens. + +Path router (when neither fits): dispatch each op on its first one or two path +segments; the table in §4 is the complete list of paths. + +Presentation services (Chord RPC): keep a derived tracked document in the shape +the client wants (e.g. Codex-style `turns[]`), update it from envelopes, ship its +own ops. Project image blobs out of `entries[].model` there, not in the kernel. + +## 9. Watchers, late joiners, multiple clients + +### 9.1 One view per conversation, many watchers + +- The kernel keeps **one** tracked view document per conversation that has at + least one watcher (not one per watch). It is built on the line the first time + a watch is opened and dropped when the last watch stops. +- After every commit that touches the conversation, the kernel mutates that one + document through its proxy, `flush()`es once, attaches the commit's events, and + hands the same `Envelope` to every watcher. Fan-out cost is per conversation; + the kernel never knows how many clients exist or what they render. +- `watch(ctx)` returns `{ view, start, stop }` where `view` is a + `structuredClone` of the tracker target taken **on the line**, tagged with the + current commit `seq`, and the subscription is installed in the same line + operation. The first envelope a watcher receives is therefore exactly + `view.seq + 1`; there is no window in which a commit can land between snapshot + and subscription. + +### 9.2 Late joiners + +A client that attaches mid-flight needs no history and no events: everything +in progress is state and is in the snapshot. + +| in flight at attach time | where the late joiner finds it | +|---|---| +| assistant message streaming | `turn.message` (partial), `turn.generation.stage === "streaming"` | +| provider backoff | `turn.generation = { stage: "retrying", retryAt, lastError }` | +| tool running | `turn.tools[i].status === "running"`, `output` so far | +| tool waiting for approval / a question | `turn.tools[i].waitingOn` (+ the plugin's own Chord service instance, `plugins.md` §6) | +| compaction | `compaction` | +| background job | `tasks[id].status` | +| queued follow-ups | `inbox` | + +This is the concrete difference from an event protocol: Codex must answer the +same question with `thread/resume` + `active_turn_snapshot()` + `activeFlags`, +and still cannot show "retrying". + +### 9.3 Reconnect + +A client keeps `lastSeq`. If an envelope arrives with `seq !== lastSeq + 1` +(only possible on a transport drop between a Chord RPC service and its client), +the client discards its replica and opens a fresh watch. Nothing is +client-specific, so there is nothing to resume, acknowledge or replay. + +### 9.4 Concurrent decisions + +Any action that answers something the view shows (approve a tool, abort an +input, change config) is a commit on the line. Two clients acting on the same +item are serialized: the first commit records the outcome, the second sees the +recorded outcome inside its own transaction and rejects with a typed error +("already decided", `already_placed`, …). Both then receive the same envelope +and converge. Plugin APIs must therefore do their check-and-record inside one +commit (`plugins.md` §2, `memoOnce`), never check-then-commit. + +### 9.5 Owned conversations + +A subagent is its own conversation with its own watch. The parent view shows +only what the parent's tool put in its slot (`details`, `continuedBy`); a UI that +wants to render the child watches the child. Presentation services may merge the +two into one derived document if a client wants a tree. + +## 10. Plugins + +Everything an extension can contribute (tools, hooks, task kinds, entry kinds, +namespaces), where its durable state lives, how it appears in this view, and how +it is packaged as Chord facets is specified in `plugins.md`. The view-facing +rules are: + +- extension state appears only as `plugins[ns]` (namespace slices), + `tasks[id].status` (kind-described), `turn.tools[i].{waitingOn,memos}` and + `tasks[id].memos` (task slots), and entries; +- extension events are `plugin..*`, emitted with the namespace token from the + extension's own commits; core events remain core-only; +- nothing about Chord services is visible in the view. A keyed service instance + (an open approval dialog) is a channel, not state; the corresponding state is + `waitingOn` on the slot. + +## 11. Kernel implementation notes + +- One tracked view document per watched conversation (§9.1); the kernel applies + each commit's effects to it (entries, config keys, inbox, turn, compaction, + tasks, plugins) through the proxy and flushes. +- Core closures record events with `tx.emit(event)`; the kernel attaches the + list to the envelope. Events are core authority; extensions emit only through + a namespace token (`plugins.md` §3). +- `turn.generation`, `compaction` and `tasks[id].status` are derived from task + records by kind-owned `describe(task)`; the raw records never leave the kernel. +- Display-only assistant entries carry the message in `data.display` and no + `model`, so context derivation needs no special case. +- Envelope assembly happens on the line; listener dispatch off the line; a + listener throw closes that watch only. +- Tests: for every row in §6, assert the exact ops and events of that commit + (memory backend, fake provider), plus snapshot-equals-fold after every + envelope and a head-in-parent capture case. + +## 12. Open items + +- `warning` payload shape (source enum vs free string). +- Whether `turn.tools` should keep finished slots of the previous assistant + message when the continuation generation prepares (current: cleared at + `prepared`; Codex keeps all items of the turn). Recommendation: keep them, keyed + by call index within `turn.exchanges[]` only if a UI needs it; otherwise + entries already hold the results. +- Whether plugin events need a schema registry for RPC clients (the plugin + token could carry TypeBox schemas per event name). +- Whether plugin-declared **extra documents** are needed for large plugin state; + start with slices in the core documents and add shards only with a + demonstrated cost.