Skip to content

Build(deps-dev): Bump lerna from 8.2.1 to 8.2.4#122

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/lerna-8.2.4
Closed

Build(deps-dev): Bump lerna from 8.2.1 to 8.2.4#122
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/lerna-8.2.4

Conversation

@dependabot
Copy link
Copy Markdown
Contributor

@dependabot dependabot Bot commented on behalf of github Sep 15, 2025

Bumps lerna from 8.2.1 to 8.2.4.

Release notes

Sourced from lerna's releases.

v8.2.4

8.2.4 (2025-07-27)

Bug Fixes

Features

  • version: update workspace specifiers in peerDependencies (#4203) (45e00ce)

v8.2.3

8.2.3 (2025-06-29)

Bug Fixes

  • use internal fork of unmaintained strong-log-transformer (#4195) (7115485)

v8.2.2

8.2.2 (2025-04-10)

Bug Fixes

  • use searchStrategy: global to fix breaking change behaviour after upgrading cosmiconfig to 9.0.0 (#4159) (6242511)
  • version: disable legacy peer deps behavior by default (#4175) (0cd3241)
Changelog

Sourced from lerna's changelog.

8.2.4 (2025-07-27)

Bug Fixes

8.2.3 (2025-06-29)

Bug Fixes

  • use internal fork of unmaintained strong-log-transformer (#4195) (7115485)

8.2.2 (2025-04-10)

Note: Version bump only for package lerna

Commits
  • 61e4bc2 chore(misc): publish 8.2.4
  • 8211512 fix: remove all remaining lodash usage (#4207)
  • 25331af chore(misc): publish 8.2.3
  • 7115485 fix: use internal fork of unmaintained strong-log-transformer (#4195)
  • bde7882 chore: kill legacy linting setup and migrate from globby to tinyglobby (#4179)
  • 6ea835d chore(misc): publish 8.2.2
  • See full diff in compare view

Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot merge will merge this PR after your CI passes on it
  • @dependabot squash and merge will squash and merge this PR after your CI passes on it
  • @dependabot cancel merge will cancel a previously requested merge and block automerging
  • @dependabot reopen will reopen this PR if it is closed
  • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

Bumps [lerna](https://github.com/lerna/lerna/tree/HEAD/packages/lerna) from 8.2.1 to 8.2.4.
- [Release notes](https://github.com/lerna/lerna/releases)
- [Changelog](https://github.com/lerna/lerna/blob/main/packages/lerna/CHANGELOG.md)
- [Commits](https://github.com/lerna/lerna/commits/v8.2.4/packages/lerna)

---
updated-dependencies:
- dependency-name: lerna
  dependency-version: 8.2.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels Sep 15, 2025
@dependabot dependabot Bot requested a review from joelteply September 15, 2025 21:21
@dependabot @github
Copy link
Copy Markdown
Contributor Author

dependabot Bot commented on behalf of github Sep 29, 2025

Superseded by #134.

@dependabot dependabot Bot closed this Sep 29, 2025
@dependabot dependabot Bot deleted the dependabot/npm_and_yarn/lerna-8.2.4 branch September 29, 2025 23:52
joelteply added a commit that referenced this pull request Jun 2, 2026
…slice 2)

## Why

Joel (2026-06-01): "Build the persona template for this Mac Intel, and
use it for the persona in the headless connected over airc general
room personas, not rigged up, detected and spawned properly. This LCD
is the lowest default."

Per [[lcd-model-qwen25-05b-and-foundry-lora]], Qwen2.5-0.5B-Instruct
Q4_K_M is the substrate's lowest-common-denominator model: plain
Qwen2 attention (no SSM ops), 468 MiB on disk, known-good llama.cpp
support, runs on Compat tier hardware including this Intel
MacBookPro15,1 + AMD Radeon Pro 560X via CPU-only path while #131
tracks the upstream ggml-metal hang fix in the
CambrianTech/llama.cpp fork.

#129 proved real cognition through this model end-to-end (qwen35
chat pipeline test, `tokens=10 text="12 times 7 is 84."` in 3.27s).
#130 confirmed multi-persona airc transport delivery (probe message
landed in channel 11c1a7ac, both Paige + Pax woke and started
inference) but used a rigged-up env-var-driven path. This commit
registers the model in `config/models.toml` so the substrate's proper
spawn path can resolve it via the registry — no hardcoded paths in
adapter code.

## What ships

### `config/models.toml`

New `[[model]]` row for `continuum-ai/qwen2.5-0.5b-instruct-GGUF`:

- `id`, `name`, `provider`, `arch` — standard registry fields
- `context_window = 32768` (model's trained ctx — adapter applies a
  smaller runtime context via persona/role intent in slice 3)
- `max_output_tokens = 4096`, `tokens_per_second = 60.0`
- `capabilities = ["text-generation", "chat", "streaming"]`
- `gguf_hint`, `gguf_local_path` — explicit local path bypasses the
  artifact resolver heuristic per the #129 slice 1 lesson
- `chat_template` — qwen2.5 chatml (matches qwen3.5)
- `stop_sequences = ["<|im_end|>", "<|endoftext|>"]` — defense-in-
  depth against EOG misdetection
- `multi_party_strategy = "proper_chat_ml_single_party"` — Qwen2.5
  was trained on standard user/assistant alternation; multi-party
  transcripts get filtered to clean two-party shape (per the prior
  qwen3.5 substrate-level findings at #75)

### Header comment

Documents the LCD doctrine in the TOML file itself so a future
operator reading the model catalog sees the substrate-strategy
context without having to dig through memory files. Cross-references
the sibling BF16 safetensors fixture (for foundry LoRA work) and the
follow-up tasks #131 (Metal fork patch) and #122 (LoRA paging).

## What's NOT here

Per-model inference knobs that don't fit the current TOML schema:
- `n_ubatch` (currently hardcoded 512 in LlamaCppAdapter::load)
- `n_seq_max` (currently derived by batching_probe)
- explicit `context_length` runtime override

These move into the registry shape in slice 3, alongside the
`LlamaCppAdapter::for_persona(persona)` constructor that reads them
all from the row per [[intent-driven-api-not-hot-patches]] and
[[orm-everything-not-hand-edited-files]].

## Tests (28 green)

- 12 generator concurrency tests (regression check, unrelated)
- 16 model_registry tests including the loader/discovery suite —
  validates that the new TOML row parses without errors and the
  registry can resolve the model by id

## Slice progression on #133

1. ✓ HwTierCategory rename (d8256f3)
2. ✓ This commit — qwen2.5-0.5b-instruct registered
3. ⏳ LlamaCppAdapter::for_persona(persona) — derive every knob from
   declared intent; per-model fields (n_ubatch, etc.) move into the
   registry shape here.
4. ⏳ Author proper Compat-tier role_template seeds (Helper + Coder
   referencing qwen2.5-0.5b model id).
5. ⏳ PersonaSpawnerModule — substrate detects, spawns, attaches to
   airc.
6. ⏳ Hardware probe → Compat detection on this Intel Mac.
7. ⏳ Verify multi-persona LCD chat through substrate-managed path,
   then begin obsessive optimization.

References: [[lcd-model-qwen25-05b-and-foundry-lora]],
[[intent-driven-api-not-hot-patches]],
[[orm-everything-not-hand-edited-files]], [[no-fallbacks-ever]],
#129 (cognition proven), #130 (transport proven), #131 (fork patch),
#132 (optimize phase).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
joelteply added a commit that referenced this pull request Jun 2, 2026
…slice 3a)

## Why

Per [[intent-driven-api-not-hot-patches]] (Joel, 2026-06-01: "Less
hacking around. More intent."): every adapter — LlamaCppAdapter,
AnthropicAdapter, OpenAICompatibleAdapter, future
OpenClawAdapter / HermesAdapter / etc — should take the SAME small
profile shape. PersonaSpawnerModule (#121) becomes the single place
that derives the profile from (role_template, hw_tier_descriptor,
model_meta, persona_state); adapters consume the resolved values
instead of each walking the persona graph themselves.

This commit defines the type alone. The LlamaCppAdapter::for_persona
constructor that consumes it lands in slice 3b; cloud adapters
follow when their for_persona path is wired (slice 3c+).

## What ships

### src/persona/inference_profile.rs (new, ~340 lines)

- **`PersonaInferenceProfile`** struct with:
  - persona_id, persona_name (tracing + log correlation)
  - model_id, gguf_local_path (pre-resolved from registry)
  - tier_category (HwTierCategory routing key) + tier_id (diagnostics)
  - context_length, n_ubatch, n_batch, n_seq_max, n_gpu_layers
    (every inference knob the substrate knows the persona needs)
  - sampling: SamplingProfile
  - chat_template, stop_sequences (per-model values pre-resolved so
    adapters don't re-query the registry per call)

- **`SamplingProfile`** struct: temperature, top_k, top_p,
  repeat_penalty, max_new_tokens. `chat_defaults()` matches the
  backend's existing `SamplingConfig::chat()` so substituting the
  profile path doesn't change persona behavior.

- **`InferenceProfileError`** with three variants — UnknownModel,
  NoLocalGguf, InsufficientHeadroom — each rendering an actionable
  diagnosis per [[no-fallbacks-ever]]. Substrate REFUSES to build a
  silently-degraded profile; either every field resolves cleanly or
  the error names what's missing and how to fix it.

ts-rs derives generate the TS counterparts at
`shared/generated/persona/{PersonaInferenceProfile,SamplingProfile}.ts`
for downstream consumers (chat surface, observability dashboards,
foundry recipes).

## Doctrine

The DERIVATION lives in ONE place (PersonaSpawnerModule, coming in
slice 5); MANY adapters consume the profile. Without this, every
adapter grows its own walk through the persona graph — different
defaults, different field ordering, divergent debugging surface.

What the profile pre-resolves vs what the registry/role keeps:

- **Profile** (per-persona, per-invocation): context_length,
  n_ubatch, n_seq_max, n_gpu_layers, sampling, chat_template (copy),
  stop_sequences (copy)
- **Registry** (TOML, per-model): arch, context_window (trained
  ceiling), chat_template (source of truth), stop_sequences (source
  of truth), gguf_local_path, multi_party_strategy
- **Role template** (per-role): cognition profile (depth, voice,
  max_response_chars, asks_before_guessing) that the spawner reads to
  derive the SamplingProfile

## Tests (16 green)

- 4 inference_profile tests:
  - chat_defaults match backend's SamplingConfig::chat() numbers
  - profile serde roundtrip uses camelCase wire shape + drops optional
    None fields
  - InferenceProfileError messages name what went wrong (role id +
    model id, missing field, required vs available headroom)
- 12 generator concurrency tests (regression check)

## Slice progression on #133

- ✓ Slice 1 (d8256f3): HwTierCategory 5-variant hierarchy
- ✓ Slice 2 (e2510c0): qwen2.5-0.5b-instruct registered
- ✓ Slice 3a (this commit): PersonaInferenceProfile type
- ⏳ Slice 3b: LlamaCppAdapter::for_persona(profile) constructor;
  retire hardcoded n_ubatch=128, route through the profile
- ⏳ Slice 4: Compat-tier role_template seeds for Helper + Coder
- ⏳ Slice 5: PersonaSpawnerModule (#121)
- ⏳ Slice 6: hw probe → tier detection
- ⏳ Slice 7: verify multi-persona LCD chat through substrate-managed
  path; obsessive optimization on this Intel Mac

References: [[intent-driven-api-not-hot-patches]], [[no-fallbacks-ever]],
[[orm-everything-not-hand-edited-files]], [[lcd-model-qwen25-05b-and-
foundry-lora]], #121 PersonaSpawnerModule (this profile's producer),
#122 shared-base + LoRA paging (n_seq_max consumer), #128 adapter
self-declaration (the rejection chain this composes with).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
joelteply added a commit that referenced this pull request Jun 2, 2026
…133 slice 6)

Materializes a Vec<Result<PersonaInferenceProfile>> from a substrate-
resolved roster + tier descriptor. Each row composes through slice 5's
build_profile so the substrate's "what personas exist on this machine?"
decision is a pure function of (hardware tier × roster × registry).

## What ships

### RosterEntry

Substrate-resolved persona slot:
- role: RoleId
- persona_id: Uuid (derived from airc peer_id per [[persona-identity-
  derives-from-source-id]])
- persona_name: String (typically from name_generator)
- model_id: String (registry id picked by role_template or future
  ORM-stored role data)

The slice 7 ServiceModule allocates each slot's airc identity FIRST,
then hands the resolved (peer_id, name) pair into the planner.

### derive_spawn_plan(roster, tier_id, tier_category, registry)

Iterates the roster, calls build_profile per row, returns one
Result<PersonaInferenceProfile> per slot.

Per [[no-fallbacks-ever]]:
- Per-row errors are kept separate (one bad model_id doesn't block
  other personas)
- Substrate refuses to substitute a default when a row fails
- Slice 7 ServiceModule decides whether to refuse boot or skip bad
  personas with a diagnostic

## Why explicit roster (not auto-derivation from role_template)

1. Identity belongs to airc, not role_template. Each persona needs a
   peer_id (from airc-attach) BEFORE the planner runs. Auto-derivation
   would require the planner to allocate airc identities, coupling
   planning to networking.

2. Model selection is changing under #123 (ORM-stored role_templates).
   The planner consumes a resolved roster so it stays stable as the
   selection logic evolves.

This keeps slice 6 testable without an airc fixture and without
touching the role_template hardcoded-Rust path.

## Tests (4 new + 12 generator regression = 16 green)

- plans_helper_and_coder_for_compat_tier — canonical Intel-Mac
  multi-persona startup state; both personas share the LCD model
  (sets up future #122 shared-base + LoRA paging)
- per_row_errors_dont_block_other_personas — Helper resolves cleanly
  while a Coder row with a nonexistent model_id errors loud
- empty_roster_yields_empty_plan — no-op contract
- tier_category_threads_into_every_profile — Compat vs MSeries
  produce different tier-shaped knobs (gpu_layers, context_length)
  for the same roster

Test fixture uses a real tempfile for gguf_local_path so the registry's
resolve_model_artifacts on-disk check passes without the real GGUF.

## Slice progression on #133

- ✓ Slice 1 (d8256f3): HwTierCategory rename
- ✓ Slice 2 (e2510c0): qwen2.5-0.5b-instruct registered
- ✓ Slice 3a (859c01c): PersonaInferenceProfile type
- ✓ Slice 3b (b70c238): LlamaCppAdapter::for_persona
- ✓ Slice 4 (a114714): demo binary uses for_persona
- ✓ Slice 5 (8f1c7b5): substrate-side build_profile
- ✓ Slice 6 (this commit): derive_spawn_plan
- ⏳ Slice 7 (planned): PersonaSpawnerModule — wraps the plan with
  airc attach + room join + persona lifecycle

References: [[intent-driven-api-not-hot-patches]], [[no-fallbacks-ever]],
[[persona-identity-derives-from-source-id]], [[lcd-model-qwen25-05b-and-
foundry-lora]], #121 PersonaSpawnerModule (slice 7 home), #122 shared-
base + LoRA paging, #123 ORM role_templates.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
joelteply added a commit that referenced this pull request Jun 2, 2026
…n plan (#133 slice 8)

For each DesiredRole in PersonaSpawnerModule.plan():
  1. Pull next PersonaIdentityIntent from a PersonaIdentityProvider
  2. PersonaInstanceManagerModule::bootstrap_one(&intent) → airc
     identity ceremony, seed.json write, registry register
  3. Build RosterEntry from airc-allocated (persona_id, agent_name)
     + planner's model_id
Then derive_spawn_plan over the full roster → Vec<MaterializedPersonaPlan>
with per-row instance + profile.

Structured BootstrapPlannedError — IdentityProviderExhausted /
IdentityProvider / AircBootstrap. Provider/airc errors are slot-fatal
(every later slot depends on them); per-row profile errors stay
per-row so the supervisor keeps its policy choice. No fallbacks
([[no-fallbacks-ever]]) — substrate refuses to substitute a "default"
persona for a failed slot.

Slice 9 will go from MaterializedPersonaPlan → LlamaCppAdapter::
for_persona at the supervisor layer that owns adapter lifetimes
(paging, eviction, shared-base per #122).

Tests:
- bootstrap_planned_exhausted_provider_errors_with_slot_info —
  provider returns None at slot 0, function short-circuits with
  IdentityProviderExhausted { slot_index=0, role=Helper, provided=0,
  required=2 }. Validates the compose wiring without needing an airc
  fixture.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
joelteply added a commit that referenced this pull request Jun 2, 2026
…ce 9)

Slice 9 turns the slice-8 MaterializedPersonaPlan into a HostedPersona:
a row owning a constructed inference adapter, ready for the slice-10
per-persona service-loop to drive.

- PersonaAdapterFactory trait: one async method (build_adapter), the
  polymorphism rail where future shapes land (#122 shared-base +
  LoRA paging, #108 cross-grid inference). Smart routing lives in
  the boot composition above; the trait stays trivial per
  [[commands-are-dumb-daemons-are-smart]].
- LlamaCppPersonaAdapterFactory: production impl that hands the
  profile to LlamaCppAdapter::for_persona. Stateless + Arc-shareable.
- HostedPersona { role, instance, adapter: Box<dyn AIProviderAdapter> }.
  Slice 10 takes a Vec<HostedPersona> and binds each persona to its
  airc room with a subscribe-and-respond loop.
- SupervisorError: Profile (slice-8 profile already failed — passes
  through) vs AdapterFactory (factory rejected this profile). Both
  tagged with slot_index + role for operator visibility.
- materialize_adapters(plans, factory): sequential per-row build
  (intentional — four ~500 MiB GGUF loads in parallel on an 8 GiB
  Intel Mac is hostile). Slice 10+ parallelizes once #122 makes the
  per-persona cost much smaller. Per [[no-fallbacks-ever]] no
  substitution, no implicit retry — failed rows stay errored.

Tests use a stub PersonaAdapterFactory so adapter materialization
runs without loading a real GGUF:
- materializes_one_adapter_per_persona_via_factory — happy path
  proves factory called once per persona, adapter.provider_id()
  matches each profile's model_id (no leaked shared state).
- forwards_profile_errors_without_calling_factory — Err(profile)
  from slice 8 becomes SupervisorError::Profile WITHOUT firing the
  factory; sibling Ok rows still materialize.
- factory_rejection_surfaces_as_adapter_factory_error — factory's
  error message threads cleanly into SupervisorError::AdapterFactory.
- empty_plans_yields_empty_hosted.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
joelteply added a commit that referenced this pull request Jun 2, 2026
The moment-of-truth slice: the airc_chat_demo loop factored into a
substrate-callable function. The supervisor — not the demo binary —
now owns the "talk to the grid as this persona" loop.

- PersonaConversation trait: substrate-friendly slice over airc's
  subscribe()/say()/page_recent. Three async methods (high_water_mark,
  next_message, say). Tests stub it; slice 11 ships the production
  AircPersonaConversation wrapping Arc<PersonaAircRuntime>.
- IncomingMessage: lamport + peer_id + text projection of the airc
  TranscriptEvent. The minimal shape the loop needs to decide
  whether to respond. Strips body unions / binary attachments out of
  the trait surface.
- ServeOptions: page_recent_limit, rag_fetch_limit, now_ms fn ptr
  (pure-of-clock per existing inspect_persona_rag convention).
- ServeOutcome: turns_replied + turns_skipped + turns_errored. The
  substrate's honest record of what happened — operators see the
  aggregate without scraping logs.
- serve_persona_loop(hosted, conversation, reader, opts):
    while next_message:
      skip if lamport <= high_water_mark  ⟵ pre-attach history
      skip if peer_id == hosted.instance.peer_id  ⟵ self-loop
      inspect_persona_rag_with_inference  ⟵ RAG + inference
      conversation.say(reply)
  Per-message errors logged + counted; loop continues per
  [[no-fallbacks-ever]] (no substitution, no silent retry, but no
  catastrophic exit either — the substrate stays up).
- Per [[no-if-statements-use-llms-for-cognition]] the loop does
  ONLY substrate filtering. "Should I respond?" is the LLM's
  judgment via the RAG+inference chain; no heuristic gate code.

Slice 9 reshape (folded in, small): HostedPersona.adapter:
Box<dyn AIProviderAdapter> → Arc<dyn AIProviderAdapter>. The loop
clone-shares the same adapter into RAG every turn; the original Box
shape forced an unsafe pointer wrapper. Arc keeps slice 9's
materialize_adapters tests green (verified) AND is the shape #122
shared-base lands into anyway.

Tests (all stubbed — no airc daemon, no GGUF):
- replies_to_inbound_from_other_peer — happy path: 1 inbound from
  other peer → 1 say(). turns_replied=1.
- skips_self_loop_messages — peer_id == own peer_id → skipped,
  no inference, no say. turns_skipped=1.
- skips_messages_below_high_water_mark — lamport <= mark → skipped.
  Verifies the boundary case (lamport == mark also skipped) +
  fresh lamport > mark replies normally.
- transient_next_message_error_does_not_kill_loop — Err from the
  conversation increments turns_errored AND the loop continues to
  the next message. Models the demo's "live stream lag — resume
  continues" behavior.

Slice 11 ships AircPersonaConversation + reshapes airc_chat_demo to
call serve_persona_loop instead of inlining its own loop.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code size: L

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants