Skip to content

Build(deps-dev): Bump @typescript-eslint/eslint-plugin from 8.29.1 to 8.44.1#130

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-8.44.1
Closed

Build(deps-dev): Bump @typescript-eslint/eslint-plugin from 8.29.1 to 8.44.1#130
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-8.44.1

Conversation

@dependabot
Copy link
Copy Markdown
Contributor

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

Bumps @typescript-eslint/eslint-plugin from 8.29.1 to 8.44.1.

Release notes

Sourced from @​typescript-eslint/eslint-plugin's releases.

v8.44.1

8.44.1 (2025-09-22)

🩹 Fixes

  • eslint-plugin: [no-base-to-string] make ignoredTypeNames match type names without generics (#11597)
  • eslint-plugin: [no-unsafe-enum-comparison] support unions of literals (#11599)
  • eslint-plugin: [await-thenable] should not report passing values to promise aggregators which may be a promise in an array literal (#11611)
  • typescript-estree: forbid class property with name constructor (#11590)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

v8.44.0

8.44.0 (2025-09-15)

🚀 Features

  • eslint-plugin: [await-thenable] report invalid (non-promise) values passed to promise aggregator methods (#11267)

🩹 Fixes

  • deps: update dependency @​eslint-community/eslint-utils to v4.8.0 (#11589)
  • eslint-plugin: [no-unnecessary-type-conversion] ignore enum members (#11490)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

v8.43.0

8.43.0 (2025-09-08)

🚀 Features

  • typescript-estree: disallow empty type parameter/argument lists (#11563)

🩹 Fixes

  • eslint-plugin: [no-non-null-assertion] do not suggest optional chain on LHS of assignment (#11489)
  • eslint-plugin: [no-unnecessary-type-conversion] only report ~~ on integer literal types (#11517)
  • eslint-plugin: [consistent-type-exports] fix declaration shadowing (#11457)

... (truncated)

Changelog

Sourced from @​typescript-eslint/eslint-plugin's changelog.

8.44.1 (2025-09-22)

🩹 Fixes

  • eslint-plugin: [await-thenable] should not report passing values to promise aggregators which may be a promise in an array literal (#11611)
  • eslint-plugin: [no-unsafe-enum-comparison] support unions of literals (#11599)
  • eslint-plugin: [no-base-to-string] make ignoredTypeNames match type names without generics (#11597)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

8.44.0 (2025-09-15)

🚀 Features

  • eslint-plugin: [await-thenable] report invalid (non-promise) values passed to promise aggregator methods (#11267)

🩹 Fixes

  • eslint-plugin: [no-unnecessary-type-conversion] ignore enum members (#11490)

❤️ Thank You

You can read about our versioning strategy and releases on our website.

8.43.0 (2025-09-08)

🚀 Features

  • typescript-estree: disallow empty type parameter/argument lists (#11563)

🩹 Fixes

  • eslint-plugin: [prefer-return-this-type] don't report an error when returning a union type that includes a classType (#11432)
  • eslint-plugin: [no-deprecated] should report deprecated exports and reexports (#11359)
  • eslint-plugin: [no-floating-promises] allowForKnownSafeCalls now supports function names (#11423, #11430)
  • eslint-plugin: [consistent-type-exports] fix declaration shadowing (#11457)
  • eslint-plugin: [no-unnecessary-type-conversion] only report ~~ on integer literal types (#11517)
  • scope-manager: exclude Program from DefinitionBase node types (#11469)
  • eslint-plugin: [no-non-null-assertion] do not suggest optional chain on LHS of assignment (#11489)
  • type-utils: add union type support to TypeOrValueSpecifier (#11526)

... (truncated)

Commits
  • c198052 chore(release): publish 8.44.1
  • c392a0d fix(eslint-plugin): [await-thenable] should not report passing values to prom...
  • 20c3d97 fix(eslint-plugin): [no-unsafe-enum-comparison] support unions of literals (#...
  • 4fde781 fix(eslint-plugin): [no-base-to-string] make ignoredTypeNames match type name...
  • 77056f7 chore(release): publish 8.44.0
  • 684e63f chore(deps): update eslint monorepo to v9.35.0 (#11600)
  • 2ed6857 fix(eslint-plugin): [no-unnecessary-type-conversion] ignore enum members (#11...
  • 85d8dea feat(eslint-plugin): [await-thenable] report invalid (non-promise) values pas...
  • 42527df chore: remove unnecessary nullThrows() (#11580)
  • ef9173c chore(release): publish 8.43.0
  • Additional commits viewable in compare view
Maintainer changes

This version was pushed to npm by [GitHub Actions](https://www.npmjs.com/~GitHub Actions), a new releaser for @​typescript-eslint/eslint-plugin since your current version.


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 [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 8.29.1 to 8.44.1.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.1/packages/eslint-plugin)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.44.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

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 22, 2025
@dependabot @github
Copy link
Copy Markdown
Contributor Author

dependabot Bot commented on behalf of github Sep 30, 2025

Superseded by #136.

@dependabot dependabot Bot closed this Sep 30, 2025
@dependabot dependabot Bot deleted the dependabot/npm_and_yarn/typescript-eslint/eslint-plugin-8.44.1 branch September 30, 2025 00:55
joelteply added a commit that referenced this pull request Jun 2, 2026
…slice 1)

## Result

Confirmed: Qwen2.5-0.5B-Instruct Q4_K_M running CPU-only via the bundled
llama.cpp on MacBookPro15,1 + Intel Core i9 + AMD Radeon Pro 560X +
Intel UHD Graphics 630 + 32 GiB RAM.

  [full] tokens=10 text="12 times 7 is 84."
  test result: ok. 1 passed; 0 failed; finished in 3.27s

Real cognition, correct arithmetic, no echo storm, stop_sequences
honored (no <|im_end|> leak). The chat-flawless foundation is online.

## Why this commit exists

#128 cfg-gated HeuristicInferenceAdapter out of production. With the
fake gone, the substrate needed a real model adapter path that
actually works on this hardware. The default Apple build path
(`--features metal`) hangs forever in `ggml_metal_device_init` on
this Mac's Intel + AMD discrete GPU combination — a known upstream
issue (see #131 fork-patch task and the issues linked there). Process
goes status "U" (uninterruptible kernel wait), zero CPU, never even
opens the GGUF, no stderr — silent hang.

Per [[no-fallbacks-ever]]: substrate must NOT silently degrade. The
right answer is either fix Metal at the source (#131, the fork patch
in CambrianTech/llama.cpp) OR provide an opt-in escape hatch for
hardware where Metal cannot init. This commit ships the escape hatch
for the chat-flawless slice; the fork patch follow-up (#131) is the
durable fix.

## What ships

### `workers/llama/Cargo.toml`

New feature `mac-cpu-only = []`. Opt-in only. Defaults unchanged.
Apple Silicon and Docker builds use `--features metal` as before;
nothing in any production path enables `mac-cpu-only`.

### `workers/llama/src/lib.rs`

`compile_error!` guard against accidentally-CPU-only Mac builds NOW
also accepts `mac-cpu-only` as the declared intentional opt-in:

```rust
#[cfg(all(target_os = "macos",
          not(feature = "metal"),
          not(feature = "mac-cpu-only")))]
compile_error!(...);
```

Builds without `metal` AND without `mac-cpu-only` still fail loud
with the same instructive message as before. The new feature is the
documented escape hatch for hardware where Metal genuinely cannot
initialize (Intel + AMD discrete + the specific driver class observed
2026-06-01).

### `workers/continuum-core/tests/qwen35_chat_pipeline_full.rs`

Env-var honoring config so the test can target THIS Mac (CPU-only,
small context) without recompiling for every parameter sweep:

  QWEN35_N_GPU_LAYERS (default: -1 = all on GPU)
  QWEN35_CONTEXT_LENGTH (default: 32_768)

Production / Apple Silicon test runs hit the defaults and behave
exactly as before. CPU-only Intel Mac runs set both to honest small
values:

  QWEN35_N_GPU_LAYERS=0
  QWEN35_CONTEXT_LENGTH=2048

## Verification

Build (no metal, mac-cpu-only):

  cargo build --release --no-default-features \
    --features livekit-webrtc,accelerate,test-fixtures,load-dynamic-ort,llama/mac-cpu-only \
    --test qwen35_chat_pipeline_full

Run:

  QWEN35_4B_GGUF=$HOME/.continuum/genome/models/qwen2.5-0.5b-instruct/qwen2.5-0.5b-instruct-q4_k_m.gguf \
  QWEN35_N_GPU_LAYERS=0 QWEN35_CONTEXT_LENGTH=2048 \
  target/release/deps/qwen35_chat_pipeline_full-<hash> \
    --ignored --nocapture qwen35_persona_style_chat_produces_coherent_short_reply

Result: test passes, model produces coherent answer to "What is 12
times 7?" in 3.27 seconds.

## What's NOT here

- New TOML row for qwen2.5-0.5b-instruct in `config/models.toml` —
  comes in #130 slice 2 (wiring the LCD through the persona path).
- LoRA training fixture — safetensors downloaded to
  `~/.continuum/genome/models/qwen2.5-0.5b-instruct/safetensors/`,
  foundry-side work in [[experiential-plasticity-mitosis-cull-sentinel]].
- Multi-persona airc round-trip — #130.
- Metal fork patch — #131 (the durable fix for the Intel + AMD hang).
- Apple Silicon / Docker build verification — `--features metal` path
  unchanged by this commit; CI on M-series should still produce
  identical artifacts.

References: [[no-fallbacks-ever]], [[no-if-statements-use-llms-for-cognition]],
[[persona-chat-flawless-before-video]], [[lcd-model-qwen25-05b-and-foundry-lora]],
#128 (heuristic cfg-gated), #130 (multi-persona LCD next), #131 (fork
patch for the Metal hang).

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

## Why

Joel (2026-06-01): "We will build a more intelligent model selection
system, but for now get the main ones in shape. And we iterate on a
workable one you should be able to talk with (plural many of them)
and start optimizing obsessively. This will speed up all the other
hardware too."

The previous 3-variant (Floor/Base/Pro) framing was a transitional
shape captured in #120. It clusters too coarsely: Sm60 (1080Ti) and
Sm120 (5090) both landed in `Pro` despite spanning 5+ years of NVIDIA
architectures; M-series Pro/Max and discrete CUDA shared a bucket
despite very different cost/perf profiles; cloud-routed inference had
no natural home.

The 5-variant taxonomy maps to hardware classes the substrate actually
targets and authors per-tier role rosters against. Each variant names
the hardware class, not a "tier number" — easier for operators to
recognize and reason about. Joel's exact framing: LCD/Compat is the
substrate's lowest-common-denominator safe mode (works everywhere);
M-series is the design center; M5+/MSeriesPro carries the headroom;
CUDA owns the discrete-NVIDIA spectrum; Cloud is the always-eligible
peer per [[inference-is-an-adapter-always-in-the-loop]].

## What ships

### src/persona/hw_tier_descriptor.rs

- `HwTierCategory` enum replaces `Floor | Base | Pro` with
  `Compat | MSeries | MSeriesPro | Cuda | Cloud`. Each variant
  documented with the hardware class it represents and the substrate
  expectations at that tier.
- Test `category_serializes_as_lowercase` updated to cover all 5
  variants — each serializes as a lowercase string token to match the
  JSON seed shape.
- Test `seeds_cover_all_three_categories` renamed and broadened to
  `seeds_cover_required_categories` — all 5 variants now required to
  have at least one shipping seed. Seeds without representatives fail
  the build loud, surfacing roster gaps at CI time.
- Test `serde_roundtrip_uses_camel_case` updated from `HwTierCategory::Base`
  to `HwTierCategory::MSeries` (the same M1 8 GiB descriptor under the
  new taxonomy).

### seeds/hw_tiers/*.json (9 files)

Category fields updated to match the new enum tokens:

  cpu_only.json                 floor → compat
  mac_intel_metal_discrete.json floor → compat
  m1_uma_8gb.json               base  → mseries
  m1_uma_16gb.json              base  → mseries
  m3_uma_pro_max.json           pro   → mseriespro
  m5_uma_pro_max.json           pro   → mseriespro
  sm60.json                     pro   → cuda
  sm120.json                    pro   → cuda
  cloud.json                    pro   → cloud

Note text in seed files still references the old taxonomy in places
("Floor tier"/"Base tier"/"Pro tier") — these are human-readable
prose and follow up in a subsequent slice that authors proper
LCD/Compat-targeted role templates. The structural change is the enum
+ category tokens; prose comes second.

## Tests (25/25 green)

- 12 generator concurrency tests (regression check)
- 11 hw_tier_descriptor tests (schema invariants, seed parsing,
  category coverage, serde shapes)
- 2 persona orm entity registration tests (cross-collection
  BaseEntity check still holds)

## What's next (#133 slices)

This is slice 1 (rename only). Following slices:

- Slice 2: add models.toml row for qwen2.5-0.5b-instruct with ALL
  per-model knobs (n_ubatch, context_length, chat_template, etc.) —
  retire the hardcoded constants from LlamaCppAdapter source per
  [[intent-driven-api-not-hot-patches]].
- Slice 3: LlamaCppAdapter::for_persona(persona) constructor — derive
  every knob from declared persona intent.
- Slice 4: author proper Compat-tier role_template seeds for Helper
  and Coder targeting LCD Qwen2.5-0.5B.
- Slice 5: PersonaSpawnerModule (#121) — detect tier, read role
  templates, spawn personas, attach to airc, join continuum room.
- Slice 6: hardware probe → tier mapping wired so substrate auto-
  detects Compat on this Intel Mac without operator override.
- Slice 7: verify multi-persona LCD chat through the substrate-managed
  path, then begin obsessive optimization on this Mac.

References: [[intent-driven-api-not-hot-patches]], [[lcd-model-qwen25-
05b-and-foundry-lora]], [[optimizing-for-low-end-compounds-on-high-end]],
[[orm-everything-not-hand-edited-files]], #120 (the original 3-variant
shape this supersedes), #121 (PersonaSpawnerModule that consumes this),
#129 (cognition proven on this Intel Mac), #130 (rigged-up demo binary
that this proper path supersedes).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
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
…ction (#133 slice 3b)

## Why

Per [[intent-driven-api-not-hot-patches]] (Joel, 2026-06-01: "Less
hacking around. More intent."): every inference adapter should take
a `PersonaInferenceProfile` (#133 slice 3a, commit 859c01c) that
the PersonaSpawnerModule (#121) derives from
(role_template, hw_tier_descriptor, model_meta). Caller paths — chat
surface, RAG inspector, future inference command hot path — never
touch n_ubatch, n_seq_max, n_gpu_layers, context_length directly;
they're already resolved in the profile.

This replaces the hand-tuned chain of `with_model_id().with_context
_length().with_n_seq_max()...` with one declarative call. The old
fluent setters survive as legacy/test escape hatches.

## What ships

### `LlamaCppAdapter` — new fields

- `n_ubatch_override: Option<u32>` — when set, the LlamaCppConfig
  built at `load()` time uses this instead of the hardcoded default.
  Solves the "decode: failed to find a memory slot for batch of size
  337" panic observed in #130 2026-06-01 when RAG-built persona
  prompts exceeded the compute-graph reservation.
- `n_gpu_layers_override: Option<i32>` — when set, profile-derived
  GPU offload depth wins over the legacy env-var policy.

Existing constructors (`try_new_from`, `with_model_id`) initialize
both to `None` so old call sites keep working unchanged. Default
n_ubatch raised from 128 to 512 (the value the in-flight #130
hot-patch shipped at) — folds the prior emergency fix into the
formally-derived path with a comment explaining the math behind the
choice.

### `LlamaCppAdapter::for_persona(profile)` — new constructor

Takes `&PersonaInferenceProfile`, returns
`Result<Self, InferenceProfileError>`. Per [[no-fallbacks-ever]]:

- If `profile.gguf_local_path` is None → `NoLocalGguf` error (cloud
  profiles route through Anthropic/OpenAI adapters, not here).
- All overrides populated from the profile:
  - `context_length_override = profile.context_length`
  - `n_seq_max_override = profile.n_seq_max`
  - `n_ubatch_override = profile.n_ubatch`
  - `n_gpu_layers_override = profile.n_gpu_layers`
  - `default_model = profile.model_id`
  - `model_path = profile.gguf_local_path` (unwrapped above)

After this, the substrate's intent-driven guarantee holds: nothing
the caller touches silently overrides what the spawner resolved.

### `with_n_ubatch` + `with_n_gpu_layers` — legacy escape hatches

Fluent setters for ad-hoc construction (tests, smoke binaries that
don't carry a profile yet). Marked in doc-comments as legacy;
production paths go through `for_persona`.

### `load()` plumbing

- `n_gpu_layers` derivation: `self.n_gpu_layers_override` wins;
  env-var `CONTINUUM_TIER=mac_intel_discrete` fallback preserved for
  install scripts that don't yet build profiles.
- `n_ubatch`: `self.n_ubatch_override.unwrap_or(512)` — the in-flight
  hot-patch lands formally here with the diagnostic comment explaining
  the 337-token RAG-prompt failure mode.

## Tests (15 green)

- 3 new for_persona tests in llamacpp_adapter::tests:
  - `for_persona_populates_all_overrides_from_profile` — every
    profile field threads through to the right override
  - `for_persona_errors_when_gguf_local_path_missing` — substrate
    refuses silent fallback per [[no-fallbacks-ever]], surfaces
    actionable NoLocalGguf error
  - `with_n_ubatch_and_n_gpu_layers_setters` — legacy fluent path
    still works for tests + ad-hoc construction
- 12 generator concurrency tests (regression check, unrelated)

## Slice progression on #133

- ✓ Slice 1 (d8256f3): HwTierCategory 5-variant hierarchy
- ✓ Slice 2 (e2510c0): qwen2.5-0.5b-instruct LCD registered
- ✓ Slice 3a (859c01c): PersonaInferenceProfile type
- ✓ Slice 3b (this commit): LlamaCppAdapter::for_persona constructor
- ⏳ Slice 4: Compat-tier role_template seeds for Helper + Coder
- ⏳ Slice 5: PersonaSpawnerModule (#121) — the producer that hands
  for_persona the profile
- ⏳ Slice 6: hardware probe → Compat detection on this Intel Mac
- ⏳ Slice 7: verify multi-persona LCD chat through substrate-managed
  path; obsessive optimization on this Intel Mac per [[optimizing-for-
  low-end-compounds-on-high-end]]

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 (consumer of for_persona),
#130 base case (the failure mode this formalizes), #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 5)

The substrate counterpart to the demo binary's ad-hoc profile
construction. ONE place derives PersonaInferenceProfile from
(persona_id, persona_name, role_id, tier_id, tier_category, model_id,
registry); the PersonaSpawnerModule (#121) will call this on every
spawn in slice 6.

Profile derivation:
- Looks up the model in the registry; UnknownModel if missing
- Looks up the model's provider to decide local vs cloud routing
- For local-inference (ProviderKind::Local): gguf_local_path MUST
  resolve, else NoLocalGguf error with the hint surfaced
- For cloud: gguf_local_path stays None
- Context length capped per tier: Compat 2048, MSeries 4096,
  MSeriesPro 8192, Cuda 16384, Cloud 32768 — all capped by the
  model's trained ceiling so weak hardware never gets a huge KV cache
- n_gpu_layers reflects tier: Compat=0 (CPU-only per #131 Metal hang),
  MSeries+/Cuda/Cloud=-1 (all-GPU / remote)
- n_ubatch=512 covers realistic 200-500 token RAG-built persona
  prompts (the size that panicked at 128 during #130)
- chat_template + stop_sequences propagated from the registry row

Per [[no-fallbacks-ever]] every miss surfaces as a structured error;
substrate refuses to construct a silently-degraded profile.

Tests (4 new + 12 generator regression = 16 green):
- builds_helper_compat_lcd_profile — happy path Helper + Compat + LCD
- n_gpu_layers_reflects_tier_category — Compat=0; MSeries+/MSeriesPro/
  Cuda=-1
- context_length_caps_by_tier — 2048/4096/8192 per category
- unknown_model_errors_with_diagnostic — refuse-and-name failure mode

Test fixture uses a real tempfile for gguf_local_path so
Registry::resolve_model_artifacts's on-disk existence check passes
without needing the real 468 MiB 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 constructor
- ✓ Slice 4 (a114714): demo binary uses for_persona
- ✓ Slice 5 (this commit): substrate-side build_profile
- ⏳ Slice 6: PersonaSpawnerModule (#121) — wraps build_profile +
  LlamaCppAdapter::for_persona + airc attach in a ServiceModule that
  fires on substrate boot

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 (consumer of build_profile),
#130 base case findings.

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

The live-airc moment. Demo binary stops doing the work itself; the
substrate-managed serve_persona_loop (slice 10) takes over against
the production conversation impl.

- AircPersonaConversation: PersonaConversation impl wrapping
  Arc<PersonaAircRuntime>.
    • high_water_mark → airc.page_recent(limit).max(lamport)
    • next_message → lazy subscribe-on-first-call, projection to
      IncomingMessage with self-skip + non-text-skip filtered IN
      the projection (loop counters stay honest), LiveLag returned
      as Err so the loop's transient-error path counts + continues
    • say → runtime.say(text)
  Constructor is cheap + infallible (subscribe is lazy) so slice 12
  can mint one of these per planned persona at boot before any of
  them necessarily attaches.

- PersonaAircRuntime::from_attached: new constructor wrapping an
  already-attached + already-joined Arc<Airc> without firing
  bootstrap's airc.join(uuid_as_string) path (which derives the
  wrong channel — the demo binary works around this by joining by
  NAME above; the constructor lets the demo continue doing so).
  bootstrap() stays untouched for the existing PersonaInstance-
  ManagerModule call site.

- airc_chat_demo main(): ~110 lines of inline subscribe + filter +
  RAG + inference + say collapsed into ~30 lines that build
  HostedPersona + AircPersonaConversation and call
  serve_persona_loop. The Joel-grade lesson from #129/#130 (no
  if-statements, no fallbacks, LCD-first) is now codified in the
  substrate, not the demo. The same call is what slice 12 fires
  from headless continuum-core boot for every persona the spawner
  planned.

Verification:
- All 17 slice-related tests green (4 supervisor + 4 service_loop +
  9 spawner/spawner_module). Pre-existing
  persona::allocator::test_allocate_no_keys failure on the branch
  HEAD is unrelated (tracked as separate task) and reproduces on
  clean stash, ruling out slice 11 as cause.
- cargo build --bin airc_chat_demo passes.

Next: slice 12 — headless continuum-core boot wires
HwCapabilityProbe + PersonaSpawnerModule.plan_for_tier +
bootstrap_planned + materialize_adapters + serve_persona_loop, one
per planned persona. Demo binary becomes a small "watch one persona
talk" smoke runner; production substrate hosts personas without it.

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: M

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants