Build(deps-dev): Bump lerna from 8.2.1 to 8.2.4#122
Closed
dependabot[bot] wants to merge 1 commit into
Closed
Conversation
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>
Contributor
Author
|
Superseded by #134. |
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>
This was referenced Jun 2, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Bumps lerna from 8.2.1 to 8.2.4.
Release notes
Sourced from lerna's releases.
Changelog
Sourced from lerna's changelog.
Commits
61e4bc2chore(misc): publish 8.2.48211512fix: remove all remaining lodash usage (#4207)25331afchore(misc): publish 8.2.37115485fix: use internal fork of unmaintained strong-log-transformer (#4195)bde7882chore: kill legacy linting setup and migrate from globby to tinyglobby (#4179)6ea835dchore(misc): publish 8.2.2Dependabot 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 rebasewill rebase this PR@dependabot recreatewill recreate this PR, overwriting any edits that have been made to it@dependabot mergewill merge this PR after your CI passes on it@dependabot squash and mergewill squash and merge this PR after your CI passes on it@dependabot cancel mergewill cancel a previously requested merge and block automerging@dependabot reopenwill reopen this PR if it is closed@dependabot closewill close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually@dependabot show <dependency name> ignore conditionswill show all of the ignore conditions of the specified dependency@dependabot ignore this major versionwill 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 versionwill 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 dependencywill close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)