snipara-companion 3.2.21 → 3.2.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,759 @@
1
+ # Changelog
2
+
3
+ Release notes for `snipara-companion`, newest first.
4
+
5
+ ## New In 3.2.23
6
+
7
+ - Preserves the canonical project profile and the authenticated owner operating
8
+ profile at the front of session bootstrap briefs, even when those durable
9
+ profiles are older than ordinary carryover.
10
+ - Keeps profile selection bounded by the requested entry and token budgets,
11
+ then ranks recent carryover and relevant decisions into the remaining space.
12
+
13
+ ## New In 3.2.22
14
+
15
+ - Clarifies Snipara Sandbox manual install guidance to use
16
+ `python -m pip install "snipara-sandbox[all]"`, where `[all]` is the pip
17
+ extra on the package spec, not a separate argument.
18
+
19
+ ## New In 3.2.19
20
+
21
+ - Adds `snipara-companion workflow sync-policy-ledger`, which uploads local
22
+ Project Policy Decision Requests, resolution receipts, apply receipts, and
23
+ policy drafts into the hosted Project Policy ledger for audit visibility.
24
+ - Keeps hosted sync observational: synced receipts are stored as bounded JSON
25
+ documents and do not approve, refuse, activate, or edit canonical Project
26
+ Policy automatically.
27
+
28
+ ## New In 3.2.17
29
+
30
+ - Adds `snipara-companion workflow policy-ledger`, a local Project Policy
31
+ decision ledger that summarizes pending, approved, refused, modified, and
32
+ deferred policy artifacts for the LLM agent.
33
+ - Includes agent-facing prompts for pending Project Policy decisions while
34
+ keeping approval explicit through `workflow decide`; the ledger never applies
35
+ policy changes automatically.
36
+
37
+ ## New In 3.2.16
38
+
39
+ - Adds an `operationalLoop` section to `snipara-companion status --json` and
40
+ text status output. It composes local workflow state, Team Sync handoff
41
+ attention, pending Decision Requests, and receipt gaps into concrete next
42
+ actions.
43
+ - Keeps the loop advisory and agent-first: it points agents toward
44
+ `workflow decisions`, `workflow decide`, `phase-commit`, and
45
+ `outcome-capture preview --emit-outcome-receipt` without editing Project
46
+ Policy, approving memory, or bypassing verification.
47
+
48
+ ## New In 3.2.15
49
+
50
+ - Adds `snipara-companion run --emit-policy-decisions` so Project Policy
51
+ `require_review` and `block` verdicts can become local Decision Requests in
52
+ the agent workflow.
53
+ - Keeps Project Policy administration review-only: resolving the request records
54
+ the human choice, while policy edits, stale marking, exceptions, or memory
55
+ invalidation still require explicit follow-up action.
56
+
57
+ ## New In 3.2.12
58
+
59
+ - Adds `snipara-companion workers execute` as the Controlled Worker Execution
60
+ V0 receipt path. It defaults to dry-run, writes
61
+ `snipara.controlled_worker_execution.receipt.v0` JSON, and records bounded
62
+ task, worker, write-scope, acceptance, proof, approval, command, and
63
+ execution evidence.
64
+ - Keeps execution fail-closed: `--execute` requires an explicit approval
65
+ receipt, high-risk commands are blocked locally, and successful commands move
66
+ to `verification_required` instead of being treated as reviewed work.
67
+ - Documents hosted Outcome Intelligence receipt ingestion as a project API
68
+ surface while keeping aggregation advisory, reviewable, and task-profile
69
+ scoped.
70
+
71
+ ## New In 3.2.11
72
+
73
+ - Adds Outcome Intelligence V0 receipt emission to
74
+ `outcome-capture preview --emit-outcome-receipt`, producing a typed
75
+ `snipara.outcome_intelligence.receipt.v0` artifact from review, test, deploy,
76
+ guard, and workflow events.
77
+ - Adds `snipara-companion run --outcome-receipts <files...>` so production
78
+ judgment runs can ingest local receipt JSON and print reason-code/task-profile
79
+ calibration buckets.
80
+ - Keeps Outcome Intelligence advisory and sample-gated: receipts are
81
+ calibration evidence, not causal proof, global agent trust, or a Project
82
+ Policy override.
83
+
84
+ ## New In 3.2.9
85
+
86
+ - Deduplicates near-identical `session-bootstrap` text brief entries by content
87
+ similarity, so workflow final commits and their checkpoint echoes do not both
88
+ consume pushed-brief slots.
89
+ - Reserves brief capacity for relevant decision entries when available, while
90
+ filtering checkpoint-like `DECISION` records that do not match the brief's
91
+ active topic.
92
+ - Makes `session-bootstrap --include-session-context` a silent no-op in
93
+ unconfigured projects, preserving the hook contract that an empty brief emits
94
+ no header or decorative output.
95
+
96
+ ## New In 3.2.8
97
+
98
+ - Ranks `session-bootstrap --include-session-context` text briefs by recent
99
+ carryover, authority, and release/deploy signal before older durable memory,
100
+ so high-signal handoffs surface ahead of stale trivia.
101
+ - Enforces the pushed brief budget at selection time, caps the default text
102
+ brief to four entries, and keeps full hosted diagnostics available through
103
+ `--json` instead of truncating noisy output after the fact.
104
+ - Filters stale/low-confidence/test bootstrap entries when fresh candidates are
105
+ available, including legacy repo-path and old memory-injection references.
106
+
107
+ ## New In 3.2.7
108
+
109
+ - Makes `workflow run --mode lite` a true zero-cost local path with no mandatory
110
+ hosted recall, context query, or bootstrap calls.
111
+ - Lets `workflow run --mode auto` route small diffs to LITE, rationale/source
112
+ questions to STANDARD, and release/deploy/architecture work to FULL or
113
+ ORCHESTRATED.
114
+ - Changes `session-bootstrap` text output into a compact pushed brief that is
115
+ silent when no high-signal memory or carryover item is available.
116
+ - Updates Companion and agent-facing docs to treat recall, context query, code
117
+ impact, and end-of-task memory as on-demand escalations instead of entry
118
+ ceremony.
119
+
120
+ ## New In 3.2.5
121
+
122
+ - Updates `doctor` guidance for the lean hosted MCP agent surface: a compact
123
+ Snipara tool set is expected, `snipara_help(query=...)` is the routed guidance
124
+ path, and `snipara_help(list_all=true)` is for inspecting specialist opt-in
125
+ surfaces.
126
+
127
+ ## New In 3.2.4
128
+
129
+ - Renders the selected human choice into `manual_apply_required` apply hints
130
+ emitted by `workflow decide`, so memory review decisions no longer leave the
131
+ literal `<human-choice>` placeholder in follow-up commands.
132
+ - Documents Worker Registry local commands in the package README, including
133
+ `workers local probe`, `add`, `list`, `status --json`, and `remove`.
134
+ - Adds `snipara-companion workers local list`, `workers local remove`, and
135
+ `workers local probe` for persisted worker profiles and easier registry
136
+ maintenance.
137
+ - Moves local worker declarations from a single `.snipara/workers/local.json`
138
+ payload to per-worker profile files under `.snipara/workers/<worker-id>.json`
139
+ with a shared `index.json` for the default worker id.
140
+ - Documents that tracked worker profiles are durable team-visible project state
141
+ shared by worktrees through Git, and that secrets must be referenced through
142
+ environment variables instead of committed in registry files.
143
+ - Adds CLI transport support for explicit OpenAI-compatible declarations as
144
+ well as declared CLI workers.
145
+ - Adds automatic migration from legacy `workers/local.json` into per-worker
146
+ profile files and keeps compatibility for existing `workflow run` routing flows.
147
+
148
+ ## New In 3.2.3
149
+
150
+ - Promotes Intent Detection V0 from a snapshot stub to an advisory session
151
+ intelligence contract with weighted signals, reason codes, evidence counts,
152
+ and suggested workflow mode hints.
153
+ - Shows detected intent, confidence, advisory suggested mode, and signals in
154
+ `workflow session`, `workflow resume --include-session-context`, and Project
155
+ Intelligence briefs.
156
+ - Keeps all Intent Detection V0 output fail-closed: `hardRoutingAllowed=false`,
157
+ no worker spawning, no merges, no canonical memory writes, and no blocking
158
+ gates from intent alone.
159
+
160
+ ## New In 3.2.2
161
+
162
+ - Adds Activity Timeline V0 under `.snipara/activity/timeline.jsonl` and a fast
163
+ Session Snapshot V0 at `.snipara/activity/session.json` for local workflow,
164
+ Team Sync, Producer Loop, and Decision Request visibility.
165
+ - Adds `workflow timeline` and `workflow session` so agents can inspect the
166
+ append-only local activity log and session snapshot directly.
167
+ - Adds `workflow timeline --export md` for redacted publishable timeline
168
+ artifacts, includes local Session Snapshot summaries in `workflow resume` and
169
+ Project Intelligence briefs, and attaches advisory-only Intent Detection V0
170
+ to the snapshot with `hardRoutingAllowed=false`.
171
+ - Emits review-only policy suggestion decision requests when repeated resolved
172
+ receipts show the same human choice and rationale; suggestions remain manual
173
+ apply only and are never auto-applied.
174
+ - Keeps Session Snapshot routing fail-closed with `hardRoutingAllowed=false`.
175
+
176
+ ## New In 3.2.1
177
+
178
+ - Hardens Companion and orchestrator handoff interop. `lead-plan --json` now
179
+ writes a default JSON artifact under `.snipara/lead-plans/` and returns the
180
+ next `snipara-orchestrator team-sync gate` command.
181
+ - Preserves comma-containing `--acceptance` criteria as one criterion across
182
+ lead-plan, agent-readiness, and adapter handoff flows.
183
+ - Makes `workflow decision-producer memory` inherit hosted `memory reviews`
184
+ evidence when available and rejects internal review item types as human
185
+ actions.
186
+ - Makes recurring policy suggestions group by producer kind, human choice, and
187
+ target category instead of exact note text, fixes inherited memory decision
188
+ apply hints to use the selected action, and reports emitted request ids from
189
+ `memory reviews --emit-decisions`.
190
+ - Improves `doctor` orchestrator diagnostics with path/source/version mismatch
191
+ detail, and gives local worker routing cards an actionable worker declaration
192
+ hint.
193
+
194
+ ## New In 3.2.0
195
+
196
+ - Adds `memory reviews`, a read-only connector for hosted human-review memory
197
+ surfaces. It reads `snipara_memory_review_queue`,
198
+ `snipara_memory_clean_candidates`, and
199
+ `snipara_memory_duplicate_candidates`, then summarizes reviewable memories
200
+ into agent-ready items.
201
+ - Adds `memory reviews --emit-decisions` to write local Decision Request V0
202
+ artifacts with readable memory evidence items. It does not mutate hosted
203
+ memory; requests still require explicit `workflow decide` resolution and use
204
+ the existing hosted/manual apply paths.
205
+
206
+ ## New In 3.1.1
207
+
208
+ - Improves Decision Request triage UX: batched Producer Loop requests now embed
209
+ readable evidence items with workflow, phase, summary, status, file hints, and
210
+ artifact path metadata, so a human can decide without manually opening every
211
+ opaque artifact id first.
212
+ - Ignores local `.snipara/decisions/` receipts in Git by default.
213
+
214
+ ## New In 3.1.0
215
+
216
+ - Adds Decision Request V0 local review routing under `.snipara/decisions/`.
217
+ `workflow decisions` lists pending questions for an LLM client to ask the
218
+ human, and `workflow decide` records a `decision_response` receipt with the
219
+ explicit reviewer choice.
220
+ - Adds `workflow producer-triage` for unreviewed Producer Loop samples. Triage
221
+ emits a batched decision request and never marks samples reviewed by itself;
222
+ `workflow decide --choose accept_all|reject_all` applies the existing
223
+ `producer-review` path and records the applied actions.
224
+ - Adds decision-request producers for `outcome-capture preview --emit-decisions`,
225
+ hosted memory review actions, and stale context risks. These requests declare
226
+ the existing apply path and do not gain any new canonical memory write
227
+ capability.
228
+
229
+ ## New In 3.0.14
230
+
231
+ - Adds `workflow producer-review` to mark local Producer Loop samples as
232
+ reviewed or rejected with reviewer, outcome, and note metadata.
233
+ - Updates `workflow producer-report` so calibration status depends on reviewed
234
+ samples, with separate reviewed, rejected, and unreviewed counts plus outcome
235
+ counts. `hardGateReady` remains false in V0.
236
+
237
+ ## New In 3.0.13
238
+
239
+ - Extends Producer Loop V0 reporting beyond the initial workflow producer:
240
+ `workflow producer-report` now accepts PR Answer Pack decision-capture
241
+ artifacts with producer kind `pr_answer_pack_decision_capture`.
242
+ - Keeps multi-producer calibration advisory-only. PR Answer Pack samples remain
243
+ review-pending evidence and do not approve durable memory, launch workers, or
244
+ become server-side compliance attestation.
245
+
246
+ ## New In 3.0.12
247
+
248
+ - Makes `workflow phase-commit` and `workflow final-commit` emit local Producer
249
+ Loop V0 artifacts under `.snipara/producer-loop/`, backed by the redacted
250
+ Coding Intelligence Ledger builder.
251
+ - Adds `workflow producer-report` to summarize local Producer Loop adoption,
252
+ producer kinds, workflow ids, latest artifact, reason-code counts, invalid
253
+ artifacts, sample size, and calibration caveats before any hard gate.
254
+ - Keeps the boundary explicit: Producer Loop artifacts are local review
255
+ evidence only. They do not launch workers, approve Project Brain memory, or
256
+ provide server-side compliance attestation.
257
+
258
+ ## New In 3.0.11
259
+
260
+ - Updates generated agent workflow guidance so FULL-mode audits use
261
+ `snipara_plan`, `snipara_decompose`, and `snipara_multi_query` deliberately
262
+ while simple one-shot lookups stay on targeted context queries.
263
+
264
+ ## New In 3.0.10
265
+
266
+ - Hardens Intent Ledger extraction in `reality-check` so source-backed intent
267
+ uses structured fields or explicit labeled sections before falling back to
268
+ legacy prose.
269
+ - Stops inferring anti-goals and rejected alternatives from generic free-text
270
+ words; those fields now require `Anti-goals:` / `Rejected alternatives:` or
271
+ structured contract input.
272
+ - Makes the Intent Ledger freshness horizon configurable through contract
273
+ policy instead of relying on an implementation-local constant.
274
+
275
+ ## New In 3.0.9
276
+
277
+ - Fixes Unknown Registry IDs in `reality-check` so unknowns use the stable
278
+ `unknown:` prefix instead of accidentally keeping a `reality:` finding prefix.
279
+ - Splits the shared Project Intelligence contracts into dedicated Reality
280
+ Check, Intent Ledger, Unknown Registry, engineering lead, and shared-helper
281
+ modules while preserving the public barrel exports used by Companion and PR
282
+ Answer Packs.
283
+ - Hardens Intent Ledger extraction internals with named status/phrase extractor
284
+ rules and a contract-level freshness horizon constant.
285
+
286
+ ## New In 3.0.8
287
+
288
+ - Adds Intent Ledger V1 to `reality-check` output so local CLI and PR Answer
289
+ Packs can show source-backed repository intent coverage, confidence, and
290
+ stale or review-pending assumptions.
291
+ - Adds Unknown Registry V1 to surface missing intent, missing verification,
292
+ stale intent, architecture drift, dirty local evidence, and heuristic
293
+ calibration gaps as explicit project unknowns.
294
+ - Hardens PR Answer Pack release readiness with named scoring weights,
295
+ structured blocking detection, and bounded related-document content filters.
296
+ - Clarifies that `reality-check --enforce` is a strict opt-in gate for
297
+ calibrated hooks because V1 heuristics remain advisory-grade.
298
+
299
+ ## New In 3.0.7
300
+
301
+ - Adds `snipara-companion reality-check` plus the
302
+ `snipara-companion intelligence reality-check` alias for local
303
+ contradiction-to-reality checks over Git-derived or supplied changed files.
304
+ - Adds `--enforce` so local hooks or CI adapters can fail on
305
+ review-required/blocking Project Reality Check findings.
306
+
307
+ ## New In 3.0.6
308
+
309
+ - Adds `snipara-companion intelligence ledger-export`, a local structured
310
+ Coding Intelligence Ledger JSON export with schema versioning, bounded
311
+ sections, confidence/calibration metadata, and redaction for secret-like
312
+ content plus local repo paths.
313
+ - Documents the ledger export in the full Companion reference so packaged docs
314
+ and the installed CLI stay aligned.
315
+
316
+ ## New In 3.0.5
317
+
318
+ - Normalizes workflow closure with Team Sync: completed workflows now close
319
+ active Team Sync work when the workflow goal is slug-like but the files and
320
+ meaningful tokens still match the active work item.
321
+
322
+ ## New In 3.0.4
323
+
324
+ - Adds compact memory audit summaries with auto-compact status, candidate
325
+ counts, and follow-up commands for safe cleanup.
326
+ - Adds Team Sync hygiene actions to stale-work summaries so dry-run archive,
327
+ completion, and handoff paths are visible without deleting data.
328
+ - Fixes Python toolchain inference in `verify` and detects
329
+ `snipara-orchestrator` installed inside common project virtualenvs.
330
+
331
+ ## New In 3.0.3
332
+
333
+ - Adds `snipara-companion workers local add|status` so a project can declare a
334
+ local OpenAI-compatible worker such as LM Studio once and reuse it from
335
+ workflow runs.
336
+ - Lets `workflow run --routing-local-worker <id>` load the declared worker,
337
+ prefer local endpoints, pin the local model, and hand the resolved runtime
338
+ metadata to `snipara-orchestrator`.
339
+ - Makes project-policy rejection explicit when local worker routing is
340
+ requested but the effective Adaptive Work Routing policy does not allow local
341
+ endpoints.
342
+ - Clarifies Team Sync stale-work and `team-sync sweep --dry-run` output so
343
+ candidates, actual archive count, and remaining stale work are visible before
344
+ cleanup.
345
+
346
+ ## New In 3.0.2
347
+
348
+ - Adds adapter-neutral `proofVerification` status to Engineering Lead execution
349
+ receipts so provided proof evidence is not treated as verified until a source
350
+ validation is recorded.
351
+ - Fails imported closed receipts back to verification-required when proof is
352
+ present but unverified.
353
+ - Limits ADE Adapter Pack V1 generation to first-party Codex and Claude Code
354
+ packs while Cursor, Orca, Windsurf, and custom packs remain planned.
355
+
356
+ ## New In 3.0.1
357
+
358
+ - Hardens local source activation validation so invalid numeric options fail
359
+ visibly instead of silently falling back to defaults.
360
+ - Keeps local source snapshots deterministic and structurally validated before
361
+ refreshes are used for code overlays.
362
+ - Removes the placeholder `DEC-002` memory decision from orchestrator handoffs
363
+ and emits only workflow/context-derived decision IDs.
364
+
365
+ ## New In 3.0.0
366
+
367
+ - Adds `snipara-companion source init|snapshot|status|sync|watch`, the local
368
+ source activation path for folders with or without Git metadata.
369
+ - Builds deterministic `.snipara/source/latest.json` snapshots, supported
370
+ document sync dry-runs, and refreshed local code overlays before any hosted
371
+ provider approval.
372
+ - Makes non-Git folders first-class for local code overlays, including
373
+ filesystem scanning, local-only overlay warnings, and stable dirty tree hashes.
374
+ - Repositions local source activation as the default free/no-provider first
375
+ value path, while keeping hosted provider sync as the canonical shared CODE
376
+ graph path.
377
+
378
+ ## New In 2.3.1
379
+
380
+ - Hardens local Adaptive Work Routing handoffs so Companion preserves
381
+ `workerProfiles` and resolver `scoreBreakdown` metadata from local
382
+ orchestrator catalogs.
383
+ - Infers preferred local worker strengths and structured-output requirements
384
+ from the workflow task before routing.
385
+ - Asks the local orchestrator to compare all discovered local models when local
386
+ worker routing is requested and no explicit model is pinned.
387
+
388
+ ## New In 2.3.0
389
+
390
+ - Adds Engineering Lead Execution Receipts V1 to `lead-plan` output. Local and
391
+ imported plans now carry expected handoff, claim, approval, proof, outcome,
392
+ and Project Brain update receipt gates while keeping `workersSpawned: 0`.
393
+ - Normalizes imported `executionReceipts` from Project Health or Companion
394
+ exports. Unknown future receipt statuses or stages fail closed and emit
395
+ `companion_dropped_unknown_execution_receipt_*` reason codes.
396
+ - Adds receipt-aware reconciliation and Markdown output so missing receipt
397
+ requirements are visible before any worker handoff.
398
+
399
+ ## New In 2.2.0
400
+
401
+ - Extends `snipara-companion lead-plan` to Engineering Lead Contract V1 with
402
+ `contractVersion`, supervised `workPackages`, and a `supervision` summary for
403
+ review/replan status, receipt requirements, and replan triggers.
404
+ - Adds `--from-plan <file>` and `--reconcile` so Companion can compare an
405
+ imported Project Health or Companion lead plan against current local workflow,
406
+ Team Sync, proof, acceptance, and file-scope signals. Stale scope and missing
407
+ continuity fail closed into visible `companion_reconcile_*` reason codes.
408
+ - Keeps imported enum drift observable for the new work-package and supervision
409
+ fields through `companion_dropped_unknown_*` reason codes.
410
+
411
+ ## New In 2.1.1
412
+
413
+ - Makes `lead-plan --from-cockpit` enum drift observable: unknown future
414
+ cockpit posture, status, worker role, worker status, or routing mode values
415
+ still fail closed, but now emit `companion_dropped_unknown_*` reason codes in
416
+ the imported summary and affected worker recommendation.
417
+
418
+ ## New In 2.1.0
419
+
420
+ - Adds `snipara-companion lead-plan`, a local Companion Engineering Lead Plan
421
+ artifact that turns workflow state, Team Sync, file scope, context refs, proof
422
+ gates, and acceptance criteria into fail-closed worker recommendations.
423
+ - Supports `--from-cockpit <file>` so a Project Health cockpit JSON export can
424
+ be normalized into the same CLI Markdown/JSON lead-plan report.
425
+ - Keeps the boundary explicit: `lead-plan` recommends contracts and handoffs,
426
+ records `workersSpawned: 0`, uses `main_agent` fallback, and does not launch
427
+ autonomous workers.
428
+
429
+ ## New In 2.0.10
430
+
431
+ - Adds `snipara-companion agent-readiness audit`, a local readiness report that
432
+ scores bounded agent delegation across scope, context, workflow continuity,
433
+ Team Sync, proof gates, verification path, and target posture.
434
+ - Adds optional ADE Adapter Pack V1 output to `snipara-companion handoff` through
435
+ `--adapter-pack --target <codex|claude-code|cursor|orca|windsurf|custom>`,
436
+ including context refs, proof gates, acceptance criteria, conflict posture,
437
+ receipt expectations, and a portable prompt for the receiving agent.
438
+ - Documents the Agent Readiness Audit and ADE Adapter Pack as service/product
439
+ surfaces without claiming native IDE control or automatic worker execution.
440
+
441
+ ## New In 2.0.9
442
+
443
+ - Aligns public package metadata with the local-first `impact` first-run
444
+ positioning.
445
+ - Adds README badges and community support/security/PR surfaces for the public
446
+ repository.
447
+ - Keeps GitHub issue-template labels aligned with the repo labels used for
448
+ launch feedback.
449
+
450
+ ## New In 2.0.8
451
+
452
+ - Keeps secret-like source files visible to local `impact` by redacting matching
453
+ lines before graph extraction instead of excluding the whole file.
454
+ - Improves missing-target warnings so `--max-files` is suggested only when the
455
+ local overlay actually hit the file cap.
456
+ - Adds launch assets, demo scripts, post drafts, and issue templates for
457
+ impact feedback, docs feedback, and contribution proposals.
458
+
459
+ ## New In 2.0.7
460
+
461
+ - Adds Project Policy / Decision Consistency V0 contracts to Project
462
+ Intelligence, including deterministic `allow`, `warn`, `require_review`, and
463
+ `block` verdicts with receipts.
464
+ - Surfaces conservative Project Policy decisions in `snipara-companion
465
+ intelligence brief` when approved resume-context decisions match the task or
466
+ changed files, and folds those receipts into `snipara-companion run` policy
467
+ gates.
468
+ - Reframes the package README around the account-free local `impact` first run,
469
+ with the full reference moved to `docs/FULL_REFERENCE.md`.
470
+ - Makes `impact` available as a top-level command and keeps code graph `auto`
471
+ source local by default, so no account or network call is required unless
472
+ `--source hosted` is explicitly requested.
473
+ - Renders local `impact` output as a human-readable Incoming/Outgoing
474
+ blast-radius by default, while preserving `--json` for the full overlay
475
+ payload.
476
+
477
+ ## New In 2.0.6
478
+
479
+ - Hardens `snipara-companion run` first-party Advisor Influence receipt capture
480
+ with stable skip reasons, total/eligible/recorded/skipped counts, bounded
481
+ write limits, per-recommendation skipped writes, and receipt automation
482
+ metadata.
483
+ - Backfills observed run verification evidence into advisor receipts through
484
+ `verificationExecuted` and bounded metadata for collaboration guard,
485
+ package-surface review, and policy-gate results. This records verification
486
+ evidence without claiming outcome proof.
487
+ - Keeps receipt writes tied to visible plan adaptation: recommendations that do
488
+ not change the agent plan are explicitly skipped instead of silently recorded.
489
+
490
+ ## New In 2.0.4
491
+
492
+ - Adds Project Intelligence policy gates to `snipara-companion run --release`,
493
+ including advisory, required-action, and block decisions for release, schema,
494
+ auth, billing, deploy, and package surfaces.
495
+ - Shows guard and Judgment Card policy blocks as explicit release blockers so
496
+ agents cannot silently continue when strong project evidence requires a stop.
497
+
498
+ ## New In 2.0.3
499
+
500
+ - Adds first-party Advisor Influence receipt capture to
501
+ `snipara-companion run` with `--served-judgment-id`, so Project Advisor
502
+ recommendations can record visible plan adaptation through the hosted
503
+ Project Intelligence receipt API.
504
+ - Adds `--skip-advisor-receipts` for runs that need to keep the receipt write
505
+ path disabled while still producing the Project Intelligence judgment output.
506
+
507
+ ## New In 2.0.2
508
+
509
+ - Passes Adaptive Work Routing daily and monthly project budgets into hosted
510
+ model requirements so the gateway can enforce budget caps against receipt
511
+ history.
512
+ - Records Local Context Pack token economy fields on metadata-only receipts:
513
+ baseline, packed, retrieved, and saved tokens. Retrieve receipts count the
514
+ retrieved local payload against savings so they do not overstate reduction.
515
+
516
+ ## New In 2.0.1
517
+
518
+ - Adds `snipara-companion context-pack pack|retrieve|stats|clean` as a
519
+ no-account local Context Pack. It stores reversible tool outputs, logs, diffs,
520
+ and notes under `.snipara/context-pack` with content-hash IDs and no raw
521
+ hosted upload, local `.gitignore` protection, restrictive file permissions,
522
+ and default blocking for secret-like input unless `--allow-sensitive` is set.
523
+ - Adds metadata-only Local Context Pack receipts to canonical event payloads,
524
+ `post-tool --pack-result`, and `workflow runtime-checkpoint --context-pack` so
525
+ workflows can reference exact local artifacts without uploading their content.
526
+
527
+ ## New In 2.0.0
528
+
529
+ - Adds project-level Adaptive Work Routing policy consumption to `workflow run`.
530
+ Companion now reads Project > Automation settings, applies endpoint and worker
531
+ class bounds, and only calls the hosted catalog when the project policy allows
532
+ catalog mode.
533
+ - Makes hosted Adaptive Work Routing catalog success explicit: missing
534
+ `success: true` is treated as fail-closed and falls back to the main agent
535
+ instead of optimistic success.
536
+ - Carries `catalogLimit` in provider-neutral model requirements so future
537
+ selection policy can tune catalog breadth without hardcoding the gateway call.
538
+ - Supports open-package local-only routing through
539
+ `.snipara/adaptive-routing.json`, so recommendation cards and handoff metadata
540
+ can be generated without Snipara SaaS, hosted context, or hosted catalog
541
+ calls.
542
+ - Documents the major routing milestone: strong planner reasoning can stay with
543
+ the main agent while scoped execution is routed to cloud, local, or
544
+ self-hosted workers through project policy and sanitized catalogs.
545
+
546
+ ## New In 1.4.20
547
+
548
+ - Treats `workflow run --mode full --max-tokens` as a workflow budget split
549
+ across durable bootstrap, optional session context, context query, shared
550
+ context, and hosted planning.
551
+ - Adds `session_bootstrap_quality` and `plan_quality.warnings` diagnostics so
552
+ agents can catch stale/test memories and weak generated-plan file hints before
553
+ editing.
554
+ - Makes `workflow resume` short-lived session context truly opt-in with
555
+ `--include-session-context` or explicit `--max-context-tokens`.
556
+ - Adds `doctor` companion version-skew reporting for stale global installs
557
+ versus the workspace package or npm latest.
558
+
559
+ ## New In 1.4.18
560
+
561
+ - Removes autonomous htask bootstrap/claim ergonomics from `snipara-companion`;
562
+ those workflow commands now belong to `snipara-orchestrator`.
563
+ - Keeps the companion `htask` and `swarm` commands as explicit legacy hosted
564
+ passthroughs that require stable IDs.
565
+
566
+ ## New In 1.4.16
567
+
568
+ - Clarifies that hosted htask and swarm coordination belong to the
569
+ `snipara-orchestrator` workflow surface.
570
+ - Keeps direct `snipara-companion htask` and `snipara-companion swarm` commands
571
+ framed as legacy passthroughs instead of the primary task-routing path.
572
+
573
+ ## New In 1.4.15
574
+
575
+ - Refines `snipara-companion run --release` Judgment Card behavior so completed
576
+ package reviews no longer remain required actions, and explicitly skipped
577
+ package reviews are shown as advisories instead of required work.
578
+ - Stops suggesting the npm package review command when the review already passed
579
+ or was intentionally skipped.
580
+
581
+ ## New In 1.4.14
582
+
583
+ - Adds a production Project Intelligence Judgment Card to `intelligence brief`
584
+ and `verify`, with weighted readiness, evidence, and required-action output.
585
+ - Adds `snipara-companion run` as the agent-facing production entrypoint that
586
+ composes resume context, memory health, code impact, release guard findings,
587
+ package review, verification hints, and the final Judgment Card.
588
+ - Adds actionable collaboration guard cards so review-only findings, blocking
589
+ conflicts, tests, handoffs, and package-surface checks are classified directly
590
+ in guard JSON and human output.
591
+
592
+ ## New In 1.4.13
593
+
594
+ - Adds `snipara-companion memory invalidate <memory-id>` and
595
+ `snipara-companion memory supersede <old-memory-id> <new-memory-id>` so agents
596
+ can apply Memory V2 lifecycle corrections through companion when a recalled
597
+ memory is obsolete or replaced.
598
+ - Keeps lifecycle mutation outside read-only hygiene commands: `memory compact`
599
+ remains dry-run only, while invalidate/supersede require explicit memory IDs.
600
+
601
+ ## New In 1.4.5
602
+
603
+ - `workflow phase-commit` and `workflow final-commit` now complete matching
604
+ local Team Sync work items when the workflow outcome is completed.
605
+ - Matching stays conservative: workflow-goal text wins, and file/token fallback
606
+ is only used when no workflow goal is available, so deploy or promotion
607
+ threads are not closed from implementation evidence alone.
608
+ - Text output now reports completed Team Sync work when workflow commits clean up
609
+ local active items.
610
+
611
+ ## New In 1.4.4
612
+
613
+ - Adds `snipara-companion memory local -- <args...>` as a thin bridge to the
614
+ open `snipara-memory` engine for no-account local memory workflows.
615
+ - Adds `snipara-companion eval export` to write a `snipara-evals` case from
616
+ local workflow, Team Sync, file, command, and expected-signal inputs.
617
+ - Adds `snipara-companion eval run` to execute `snipara-evals` through `npx` or a
618
+ configured local runner.
619
+ - Clarifies the open Mini Snipara stack boundary: local continuity and evals are
620
+ open, while team-wide presence, shared locks, GitHub checks, dashboards, and
621
+ Cloud code graph remain hosted Snipara capabilities.
622
+
623
+ ## New In 1.4.8
624
+
625
+ - Adds `snipara-companion collaboration guard --ack-review-only` so enforced
626
+ release guards can acknowledge review-only stale-state and
627
+ decision-consistency warnings without requiring
628
+ `SNIPARA_COLLABORATION_GUARD=0`. The hosted `REVIEW_REQUIRED` verdict stays
629
+ visible in the guard payload; `BLOCKED`, `REQUIRES_ACK`, active-session
630
+ conflicts and blocking leases still fail.
631
+ - Updates the Infomaniak deploy guard to use the review-only ack path for
632
+ release UX false positives while keeping the emergency env bypass reserved for
633
+ true guard outages.
634
+
635
+ ## New In 1.4.2
636
+
637
+ - Adds `snipara-companion collaboration start|watch|claim|guard|release|status`
638
+ for safe parallel coding presence, auto-claims, advisory/exclusive resource
639
+ claims, hosted guard checks, and conflict alarms across humans and agents.
640
+ - Adds `snipara-companion collaboration hooks install` plus guard profiles for
641
+ blocking pre-commit, pre-push, pre-deploy, schema/migration, and package
642
+ release checks.
643
+ - Adds `snipara-companion collaboration ide-status` for editor extensions and
644
+ local companion UIs that need compact live collaboration state.
645
+ - Hardens local code impact so stale or incomplete local overlay caches report
646
+ missing target files instead of silently returning an empty impact set.
647
+ - Adds `snipara-companion workflow impact-gate` for committed local workflow
648
+ phases that are ahead of upstream but not pushed yet. It compares
649
+ `upstream..HEAD`, separates dirty working-tree files, runs local code-overlay
650
+ impact on the committed code files, and maps the result back to completed
651
+ workflow phases.
652
+
653
+ ## New In 1.4.1
654
+
655
+ - Makes local code overlay Git hooks background by default so `git commit` and
656
+ `git push` return quickly while Snipara refreshes local overlay state and
657
+ push-time promotion asynchronously.
658
+ - Adds `snipara-companion code hooks install --synchronous` for teams that
659
+ intentionally want foreground hook work, plus a configurable background
660
+ reindex delay for pre-push promotion.
661
+
662
+ ## New In 1.3.7
663
+
664
+ - Hardens `memory-guard check` with `--confirmed-by-user "<confirmation>"`
665
+ for explicit, auditable overrides after the user has reviewed destructive or
666
+ contradictory signals.
667
+ - Adds stable guard exit codes in strict mode: `20` for confirmation required,
668
+ `21` for unavailable memory/context guidance, and `22` for invalid guard
669
+ options.
670
+ - Validates destructive checks before hosted calls so vague commands such as
671
+ `--destructive` without `--intent` or `--command` fail fast.
672
+ - Extends `snipara-companion init --with-hooks` so it also installs local code
673
+ overlay Git hooks (`post-commit` sync and `pre-push` promotion/reindex).
674
+
675
+ ## New In 1.3.6
676
+
677
+ - Adds `snipara-companion memory audit` for a read-only memory hygiene pass that
678
+ combines hosted memory health, cleanup candidates, and compaction dry-run.
679
+ - Adds `memory health`, `memory clean-candidates`, and `memory compact` as
680
+ direct companion maintenance commands. `memory compact` always sends
681
+ `dry_run=true` and does not mutate memory.
682
+ - Extends `memory-guard check` with `--intent`, `--destructive`, and
683
+ `--require-confirmation` so agents can surface memory/context contradictions
684
+ and ask the user before irreversible actions.
685
+
686
+ ## New In 1.3.0
687
+
688
+ - Adds top-level Git-style agent work commands: `status`, `brief`, `timeline`,
689
+ `verify`, `handoff`, and `workflow resume`.
690
+ - Adds `snipara-companion verify` for transparent verification plans based on
691
+ companion code impact auto-source selection plus local package scripts.
692
+ - Reframes companion as the day-two continuity surface after
693
+ `npx create-snipara` installs the project.
694
+
695
+ ## New In 1.2.0
696
+
697
+ - Adds `snipara-companion intelligence brief` for a local Project Intelligence brief that composes hosted resume context, memory health, and code impact into one agent-ready output.
698
+ - Adds `workflow scaffold --preset project-intelligence-continuity-layer` for the full memory + code graph + workflow continuity roadmap.
699
+ - Updates generated agent workflow instructions so new work can call the Project Intelligence brief before risky changes and scaffold the roadmap preset for multi-phase delivery.
700
+
701
+ ## New In 1.1.15
702
+
703
+ - Expands `init --client` to Claude Code, Cursor, Windsurf, Codex, Gemini, Mistral, ChatGPT, VS Code, Continue, and custom MCP clients.
704
+ - Keeps Claude Code, Cursor, and Windsurf as hook-capable presets while treating Mistral, ChatGPT, VS Code, Continue, and custom clients as MCP-first setup presets.
705
+ - Prints Codex TOML or HTTP MCP references for MCP-first clients instead of generating unsupported legacy hooks.
706
+
707
+ ## New In 1.1.14
708
+
709
+ - Adds `npx -y snipara-companion@latest automations install/status/diff/update` for installing dashboard-generated automation hook bundles locally.
710
+ - `init --with-hooks` now delegates hook installation to the hosted automation config bundle so Claude Code, Cursor, and Windsurf use the same templates as Project Automation.
711
+ - Managed automation files are tracked in `.snipara/automations/manifest.json` and are not overwritten after local edits unless `--force` is used.
712
+ - Automation REST calls now use `www.snipara.com` while MCP calls stay on `api.snipara.com`, avoiding FastAPI IP rate limits on Stuck Guard and generated hook installs.
713
+
714
+ ## New In 1.1.13
715
+
716
+ - Adds `snipara-companion stuck-guard status/check/simulate` for hosted Memory Guard / Stuck Guard decisions.
717
+ - `pre-tool` now emits canonical `tool_call` events and prints Rescue Packs when hosted Stuck Guard returns `inject` or `enforce`.
718
+ - `post-tool` now emits canonical `tool_result` events with status, exit code, command, classification, and a redacted/truncated preview.
719
+
720
+ ## New In 1.1.12
721
+
722
+ - Documents the GitHub PR Answer Packs boundary: use `create-snipara --github`
723
+ for the hosted GitHub App setup, and use `snipara-companion` only for local
724
+ planning, code impact checks, workflow state, and memory commits.
725
+
726
+ ## New In 1.1.10
727
+
728
+ - Snipara Sandbox guidance now points existing projects to `npx create-snipara repair --with-runtime`
729
+ - Managed workflow phases marked `needs_runtime` suggest Snipara Sandbox installation only when needed
730
+
731
+ ## New In 1.1.4
732
+
733
+ - `snipara-companion onboard-folder` previews and applies dashboardless business-folder imports from local or LLM-materialized sources
734
+ - `snipara-companion workflow start/status/resume/phase-start/phase-commit` keeps a visible LLM plan in `.snipara/workflow/current.json` and persists each phase through hosted memory so compacted agents can resume safely
735
+ - `snipara-companion final-commit` persists the final workflow outcome with `snipara_end_of_task_commit`
736
+ - `snipara-companion code symbol-card` and `snipara-companion code impact` expose paid Context safeguards directly from the companion CLI
737
+
738
+ ## New In 1.1.2
739
+
740
+ - `snipara-companion doctor` and Snipara Sandbox hints detect provider keys from local `.env` files without printing secret values
741
+
742
+ ## New In 1.1.1
743
+
744
+ - `snipara-companion doctor` diagnoses Snipara auth, Snipara Sandbox, Snipara Sandbox MCP, provider keys, and Docker
745
+ - `workflow run` prints contextual Snipara Sandbox hints for full/orchestrated/execution-heavy work
746
+ - `workflow run --no-runtime-hint` hides Snipara Sandbox guidance for scripted terminal output
747
+
748
+ ## New In 1.1.0
749
+
750
+ - `business-collections` commands for Team Business Context presets and reusable business docs
751
+ - `client-projects` commands for creating and listing project-scoped client context workspaces
752
+ - `upload --metadata/--metadata-file` plus convenience metadata flags for single-file business/client uploads
753
+
754
+ ## New In 1.0.0
755
+
756
+ - direct `snipara-companion code` access for `callers`, `imports`, `neighbors`, and `shortest-path`
757
+ - `workflow run --mode lite|standard|full|orchestrate` for hosted-first workflow routing; `auto` remains a STANDARD compatibility alias
758
+ - `snipara-companion shared-context` for project-linked standards and team guidance
759
+ - automatic fallback to project token auth when a stale `SNIPARA_API_KEY` overrides a valid local login
package/README.md CHANGED
@@ -39,6 +39,12 @@ workflow phase state, Team Sync handoff summary, passive source snapshot status,
39
39
  session snapshot summary, stable local artifact paths, and recommended next
40
40
  actions.
41
41
 
42
+ Session bootstrap treats two explicit profiles as durable operating context:
43
+ the project profile is selected first, followed by the authenticated owner
44
+ profile. These profiles reserve bounded space ahead of ordinary decisions and
45
+ carryover; Companion does not infer a psychological profile from conversation
46
+ history.
47
+
42
48
  Use this after `create-snipara` activation. `create-snipara` remains the
43
49
  canonical engine for first workspace setup; Companion owns the repeatable local
44
50
  continuity loop after that.
package/dist/index.d.ts CHANGED
@@ -486,9 +486,16 @@ interface SessionMemoryTier {
486
486
  count: number;
487
487
  tokens: number;
488
488
  }
489
+ interface SessionMemoryProfiles extends Record<string, unknown> {
490
+ project_memory_id?: string | null;
491
+ owner_memory_id?: string | null;
492
+ tokens?: number;
493
+ precedence?: string[];
494
+ }
489
495
  interface SessionMemoriesResult extends Record<string, unknown> {
490
496
  critical: SessionMemoryTier;
491
497
  daily: SessionMemoryTier;
498
+ profiles?: SessionMemoryProfiles;
492
499
  total_tokens?: number;
493
500
  message?: string;
494
501
  }
package/dist/index.js CHANGED
@@ -583,15 +583,29 @@ function normalizeSessionMemoryTier(value) {
583
583
  tokens: typeof value.tokens === "number" ? value.tokens : 0
584
584
  };
585
585
  }
586
+ function normalizeSessionMemoryProfiles(value) {
587
+ if (!isRecord(value)) {
588
+ return void 0;
589
+ }
590
+ return {
591
+ ...value,
592
+ project_memory_id: typeof value.project_memory_id === "string" ? value.project_memory_id : null,
593
+ owner_memory_id: typeof value.owner_memory_id === "string" ? value.owner_memory_id : null,
594
+ tokens: typeof value.tokens === "number" ? value.tokens : void 0,
595
+ precedence: Array.isArray(value.precedence) ? value.precedence.filter((entry) => typeof entry === "string") : void 0
596
+ };
597
+ }
586
598
  function normalizeSessionMemoriesResult(value) {
587
599
  const record = isRecord(value) ? value : {};
588
600
  const critical = normalizeSessionMemoryTier(record.critical);
589
601
  const daily = normalizeSessionMemoryTier(record.daily);
602
+ const profiles = normalizeSessionMemoryProfiles(record.profiles);
590
603
  const derivedTotalTokens = critical.tokens + daily.tokens;
591
604
  return {
592
605
  ...record,
593
606
  critical,
594
607
  daily,
608
+ profiles,
595
609
  total_tokens: typeof record.total_tokens === "number" ? record.total_tokens : derivedTotalTokens || void 0,
596
610
  message: typeof record.message === "string" ? record.message : void 0
597
611
  };
@@ -13089,7 +13103,9 @@ function printDoctorReport(report, companionVersion, auth, toolCatalog) {
13089
13103
  } else {
13090
13104
  console.log("- Existing project: npx create-snipara repair --with-runtime.");
13091
13105
  console.log("- Fresh setup: npx create-snipara --profile full-stack --advanced.");
13092
- console.log("- Manual install: pip install 'snipara-sandbox[all]'.");
13106
+ console.log(
13107
+ '- Manual install: python -m pip install "snipara-sandbox[all]" (`[all]` is the pip extra, not a separate argument).'
13108
+ );
13093
13109
  }
13094
13110
  console.log("");
13095
13111
  console.log(import_chalk4.default.bold("Snipara Orchestrator guidance"));
@@ -19204,6 +19220,8 @@ var DEFAULT_SHARED_CONTEXT_TOKENS = 2e3;
19204
19220
  var DEFAULT_WORKFLOW_RUN_TOKENS = 8e3;
19205
19221
  var MIN_WORKFLOW_SURFACE_TOKENS = 200;
19206
19222
  var STALE_BOOTSTRAP_MEMORY_DAYS = 90;
19223
+ var PROJECT_PROFILE_CATEGORY = "tenant_profile";
19224
+ var OWNER_OPERATING_PROFILE_CATEGORY = "owner_operating_profile";
19207
19225
  var TASK_COMMIT_TIMEOUT_MS = 3e4;
19208
19226
  var FINAL_COMMIT_TIMEOUT_MS = 9e4;
19209
19227
  var COMPANION_CONTINUITY_CONTRACT_VERSION = "snipara.companion.continuity.v1";
@@ -19807,10 +19825,19 @@ function isSessionCarryoverEntry(entry) {
19807
19825
  const text = readBootstrapEntryText(entry).toLowerCase();
19808
19826
  return category.includes("team_sync_handoff") || category.includes("journal:") || category.includes("workflow-phase") || text.includes("checkpoint: workflow:final-commit") || text.includes("final commit") || text.includes("phase-commit") || text.includes("handoff");
19809
19827
  }
19828
+ function isOwnerOperatingProfileEntry(entry) {
19829
+ return typeof entry.category === "string" && entry.category.toLowerCase() === OWNER_OPERATING_PROFILE_CATEGORY;
19830
+ }
19831
+ function isProjectProfileEntry(entry) {
19832
+ return typeof entry.category === "string" && entry.category.toLowerCase() === PROJECT_PROFILE_CATEGORY;
19833
+ }
19834
+ function isPinnedBootstrapProfileEntry(entry) {
19835
+ return isProjectProfileEntry(entry) || isOwnerOperatingProfileEntry(entry);
19836
+ }
19810
19837
  function isLikelyStaleBootstrapEntry(entry, now) {
19811
19838
  const age = entryAgeDays(entry, now);
19812
19839
  const text = readBootstrapEntryText(entry).toLowerCase();
19813
- return typeof age === "number" && age > STALE_BOOTSTRAP_MEMORY_DAYS || typeof entry.confidence === "number" && entry.confidence < 0.5 || text.includes("/users/alopez/devs/snipara/.env") || text.includes("rlm_remember") || text.includes("rlm_recall") || text.includes("railway") || text.includes("vercel") || text.includes("memory injection feature is complete") || text.includes("infotooltip component created") || text.includes("mcp performance optimizations (jan 2026)");
19840
+ return typeof age === "number" && age > STALE_BOOTSTRAP_MEMORY_DAYS && !isPinnedBootstrapProfileEntry(entry) || typeof entry.confidence === "number" && entry.confidence < 0.5 || text.includes("/users/alopez/devs/snipara/.env") || text.includes("rlm_remember") || text.includes("rlm_recall") || text.includes("railway") || text.includes("vercel") || text.includes("memory injection feature is complete") || text.includes("infotooltip component created") || text.includes("mcp performance optimizations (jan 2026)");
19814
19841
  }
19815
19842
  function scoreBootstrapBriefEntry(entry, source2, now) {
19816
19843
  let score = source2 === "daily" ? 100 : 0;
@@ -19966,27 +19993,55 @@ function buildSessionBootstrapBrief(result, options) {
19966
19993
  ...normalized.critical.memories.map((entry) => ({ entry, source: "critical" })),
19967
19994
  ...options.includeSessionContext ? normalized.daily.memories.map((entry) => ({ entry, source: "daily" })) : []
19968
19995
  ];
19996
+ const projectProfile = candidates.find(
19997
+ (candidate) => normalized.profiles?.project_memory_id && readBootstrapEntryId(candidate.entry) === normalized.profiles.project_memory_id || isProjectProfileEntry(candidate.entry)
19998
+ )?.entry;
19999
+ const ownerProfile = candidates.find(
20000
+ (candidate) => normalized.profiles?.owner_memory_id && readBootstrapEntryId(candidate.entry) === normalized.profiles.owner_memory_id || isOwnerOperatingProfileEntry(candidate.entry)
20001
+ )?.entry;
20002
+ const pinnedProfiles = [projectProfile, ownerProfile].filter(
20003
+ (entry) => Boolean(entry)
20004
+ );
19969
20005
  const seen = /* @__PURE__ */ new Set();
19970
- const ranked = candidates.map((candidate, index) => ({
20006
+ const entries = [];
20007
+ let estimatedTokens = 0;
20008
+ for (const profile of pinnedProfiles) {
20009
+ const profileTokens = estimateBootstrapEntryTokens(profile);
20010
+ const profileId = readBootstrapEntryId(profile);
20011
+ const profileText = readBootstrapEntryText(profile).slice(0, 140).toLowerCase();
20012
+ const key = profileId || profileText;
20013
+ if (entries.length < maxEntries && !seen.has(key) && estimatedTokens + profileTokens <= budgetTokens) {
20014
+ seen.add(key);
20015
+ entries.push(profile);
20016
+ estimatedTokens += profileTokens;
20017
+ }
20018
+ }
20019
+ const reservedEntryCount = entries.length;
20020
+ const remainingEntrySlots = maxEntries - reservedEntryCount;
20021
+ const selectedProjectProfileId = projectProfile ? readBootstrapEntryId(projectProfile) : void 0;
20022
+ const ranked = candidates.filter(
20023
+ (candidate) => !isOwnerOperatingProfileEntry(candidate.entry) && candidate.entry !== projectProfile && !(selectedProjectProfileId && readBootstrapEntryId(candidate.entry) === selectedProjectProfileId)
20024
+ ).map((candidate, index) => ({
19971
20025
  ...candidate,
19972
20026
  index,
19973
20027
  score: scoreBootstrapBriefEntry(candidate.entry, candidate.source, now)
19974
20028
  })).sort((a, b) => b.score - a.score || b.index - a.index);
19975
20029
  const hasFreshCandidate = ranked.some(
19976
20030
  (candidate) => candidate.score > 0 && !isLikelyStaleBootstrapEntry(candidate.entry, now) && !isLikelyTestMemory(candidate.entry)
19977
- );
20031
+ ) || reservedEntryCount > 0;
19978
20032
  const topicTokens = buildBootstrapTopicTokens(ranked);
19979
20033
  const hasCarryoverCandidate = ranked.some(
19980
20034
  (candidate) => candidate.score > 0 && isSessionCarryoverEntry(candidate.entry) && !isLikelyStaleBootstrapEntry(candidate.entry, now) && !isLikelyTestMemory(candidate.entry)
19981
20035
  );
19982
- const hasFreshDecisionCandidate = maxEntries >= 4 && ranked.some(
20036
+ const hasFreshDecisionCandidate = maxEntries >= 4 && remainingEntrySlots > 0 && ranked.some(
19983
20037
  (candidate) => candidate.score > 0 && isDecisionRelevantToBootstrap(candidate.entry, topicTokens, hasCarryoverCandidate) && !isLikelyStaleBootstrapEntry(candidate.entry, now) && !isLikelyTestMemory(candidate.entry)
19984
20038
  );
19985
- const entries = [];
19986
- let estimatedTokens = 0;
19987
20039
  let selectedCarryoverCount = 0;
19988
20040
  let selectedDecisionCount = 0;
19989
20041
  for (const candidate of ranked) {
20042
+ if (entries.length >= maxEntries) {
20043
+ break;
20044
+ }
19990
20045
  if (hasFreshCandidate && (isLikelyStaleBootstrapEntry(candidate.entry, now) || isLikelyTestMemory(candidate.entry))) {
19991
20046
  continue;
19992
20047
  }
@@ -20004,7 +20059,7 @@ function buildSessionBootstrapBrief(result, options) {
20004
20059
  if (isDecision && !isDecisionRelevantToBootstrap(candidate.entry, topicTokens, hasCarryoverCandidate)) {
20005
20060
  continue;
20006
20061
  }
20007
- if (hasFreshDecisionCandidate && selectedDecisionCount === 0 && isCarryover && selectedCarryoverCount >= maxEntries - 1) {
20062
+ if (hasFreshDecisionCandidate && selectedDecisionCount === 0 && isCarryover && selectedCarryoverCount >= Math.max(0, remainingEntrySlots - 1)) {
20008
20063
  continue;
20009
20064
  }
20010
20065
  const entryTokens = estimateBootstrapEntryTokens(candidate.entry);
@@ -23191,7 +23246,9 @@ function printRuntimeHint(query, mode) {
23191
23246
  console.log("Need sandboxed execution or autonomous Sandbox jobs?");
23192
23247
  console.log("Existing project: npx create-snipara repair --with-runtime");
23193
23248
  console.log("Fresh setup: npx create-snipara --profile full-stack --advanced");
23194
- console.log("Manual install: pip install 'snipara-sandbox[all]'");
23249
+ console.log(
23250
+ 'Manual install: python -m pip install "snipara-sandbox[all]" (`[all]` is the pip extra, not a separate argument).'
23251
+ );
23195
23252
  }
23196
23253
  function printLiteWorkflowRun(query, requestedMode) {
23197
23254
  console.log(import_chalk6.default.bold("Workflow Lite"));
@@ -203,7 +203,7 @@ snipara-companion
203
203
 
204
204
  ## Changelog
205
205
 
206
- Release notes have moved to [CHANGELOG.md](./CHANGELOG.md).
206
+ Release notes have moved to [CHANGELOG.md](../CHANGELOG.md).
207
207
 
208
208
  ## Agentic Work Commands
209
209
 
@@ -1022,6 +1022,11 @@ Short-lived session context is skipped unless you pass `--include-session-contex
1022
1022
  or an explicit `--max-context-tokens`. Text output is a compact bootstrap brief
1023
1023
  and is silent when no high-signal item is available; use `--json` for the full
1024
1024
  payload.
1025
+ The brief reserves bounded space for the newest project/client profile and then
1026
+ the authenticated owner operating profile before ranking decisions and recent
1027
+ carryover. Additional project/client profiles remain eligible critical context.
1028
+ The owner profile is explicit and reviewable; Companion does not infer it from
1029
+ conversation history.
1025
1030
  `workflow run --mode full --json` also reports `workflow_budget`,
1026
1031
  `session_bootstrap_quality`, and `plan_quality.warnings` so agents can detect
1027
1032
  oversized bootstrap context or weak generated-plan file hints before editing.
@@ -1337,7 +1342,7 @@ Semantics:
1337
1342
  - `snipara-companion reindex` = trigger or poll hosted `snipara_reindex`; use after uploads when immediate chunk availability matters
1338
1343
  - `snipara-companion code *` = direct access to the code graph tools without routing through `snipara_context_query`
1339
1344
  - `snipara-companion recall` = direct durable memory lookup for decisions, learnings, preferences, and carryover
1340
- - `snipara-companion session-bootstrap` = pushed compact brief of durable memory first, optional weak session carryover second; empty brief is silent in text mode
1345
+ - `snipara-companion session-bootstrap` = pushed compact brief ordered as newest project/client profile, explicit owner profile, decisions, other durable memory, then optional weak session carryover; empty brief is silent in text mode
1341
1346
  - `snipara-companion task-commit` = durable task/phase/workflow outcomes only, not a mechanical mirror of every Git commit
1342
1347
  - `snipara-companion memory-guard check` = deterministic guard recall/context before retries, commits, or finalization when a command failed or a publishable package surface is touched
1343
1348
  - `snipara-companion memory-guard check --intent "<action>" --destructive --strict` = contradiction check before irreversible actions; blocks until the user explicitly confirms when memory/context disagrees or the action is destructive
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "snipara-companion",
3
- "version": "3.2.21",
3
+ "version": "3.2.23",
4
4
  "description": "Local-first CLI that asks your repo what breaks before an AI coding agent edits it.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -71,6 +71,7 @@
71
71
  },
72
72
  "files": [
73
73
  "dist",
74
- "docs"
74
+ "docs",
75
+ "CHANGELOG.md"
75
76
  ]
76
77
  }