nsalerni commited on
Commit
d506628
·
verified ·
1 Parent(s): 9f3ae4e

loudink-v1.1 1.1.0: skills PR-A–E canary (record/replay, slots, expanded daily-mac)

Browse files
README.md ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ tags:
4
+ - flowcast
5
+ - loudink
6
+ - loudink-v1.1
7
+ - voice-agent
8
+ - mlx
9
+ - apple-silicon
10
+ - compact-ir
11
+ - dictation
12
+ - computer-use
13
+ - skills
14
+ - record-and-replay
15
+ library_name: mlx-lm
16
+ ---
17
+
18
+ # loudink-v1.1 v1.1.0 (canary)
19
+
20
+ On-device dual-stack for **LoudInk / Flowcast** on Apple Silicon, plus **user skills**:
21
+
22
+ 1. **Writer** — LFM2.5-1.2B LoRA (dictation polish / messages / email / prompts)
23
+ 2. **Planner** — FunctionGemma compact-IR LoRA (`run_skill` + freeform computer-use)
24
+ 3. **Skill store** — local JSON skills (record → compile → voice replay)
25
+
26
+ **Stable GA line:** [`nsalerni/loudink-v1`](https://huggingface.co/nsalerni/loudink-v1) (0.4.0 freeze).
27
+ This package is the **v1.1 canary** (PR-A→E). Prefer dual-package client routing with kill-switch to v1.
28
+
29
+ ## Product bars (v1.1)
30
+
31
+ | Slice | Shipped | Neural | Latency |
32
+ |-------|---------|--------|---------|
33
+ | Writing daily | **100%** | **92.0%** | p50 **171 ms** |
34
+ | Computer daily | **100%** | — | mostly fast-path |
35
+ | Multi-step | **100%** | — | mostly fast-path |
36
+ | **Daily-Mac overall (n=69)** | **100%** | — | — |
37
+ | Skill invoke (n=19) | **100%** | — | deterministic store |
38
+ | IR honesty (n=112, no FP) | — | **46.4%** | honesty lineage |
39
+
40
+ Holds loudink-v1 0.4 bars; writing neural improved on expanded suite (~92% vs ~86%).
41
+
42
+ ## Bundle layout
43
+
44
+ ```
45
+ writer/ # optional promoted_core_100.safetensors seed adapter
46
+ writer_unified/ # production writer LoRA
47
+ ir/ # skill-aware IR LoRA
48
+ ir_honesty_fallback/ # v0.4 honesty IR (optional rollback)
49
+ skill_store/ # example seed skills (not user data)
50
+ router.json
51
+ manifest.json
52
+ inference_config.json
53
+ ```
54
+
55
+ **Bases are not vendored** (size). Pull 4-bit bases:
56
+
57
+ - Writer: `mlx-community/LFM2.5-1.2B-Instruct-4bit`
58
+ - IR: `mlx-community/functiongemma-270m-it-4bit`
59
+
60
+ ## Skills (record → replay)
61
+
62
+ ```python
63
+ from huggingface_hub import snapshot_download
64
+ from gemmaflow_tune.skills.store import SkillStore
65
+ from gemmaflow_tune.skills.invoke import try_skill_invoke_plan
66
+
67
+ bundle = snapshot_download("nsalerni/loudink-v1.1")
68
+ store = SkillStore(f"{bundle}/skill_store")
69
+ plan = try_skill_invoke_plan("run my invoice chase for Acme", skill_store=store)
70
+ ```
71
+
72
+ Client should point `skill_store_path` at a **user-writable** directory and merge or replace example seeds. Private recordings stay local; do not train cloud models on them by default.
73
+
74
+ ### IR extension
75
+
76
+ ```json
77
+ {"intent": "run_skill", "skill_id": "invoice_chase", "slots": {"company": "Acme"}, "confidence": 0.92}
78
+ ```
79
+
80
+ Unknown `skill_id` → null plan (never invent). Freeform (`open gmail`) never hijacks skills.
81
+
82
+ ### Vision (PR-E)
83
+
84
+ `skills/vision.py` scaffold is in the training repo; default **disabled**. Client injects a resolver when ready.
85
+
86
+ ## Integration
87
+
88
+ ```python
89
+ # runner_kind: loudink_v1
90
+ # skill_store_path: {bundle}/skill_store # or user path
91
+ # ir_adapter_path: {bundle}/ir
92
+ # writer_unified_adapter_path: {bundle}/writer_unified
93
+ ```
94
+
95
+ See `inference_config.json` and `client_contract.md`.
96
+
97
+ ## Methods (v1.1)
98
+
99
+ - PR-A: Skill schema, store, recorder compiler, null-safe `run_skill`
100
+ - PR-B: Paraphrase invoke + skill_invoke bench + light IR SFT
101
+ - PR-C: Deterministic slot fill (`for` / `about` / named)
102
+ - PR-D: Expanded daily-Mac computer + writing cases
103
+ - PR-E: Vision fallback scaffold (noop until client wires resolver)
104
+
105
+ ## License
106
+
107
+ Apache-2.0 (adapters + example skills). Base model licenses apply to community 4-bit bases. **User-recorded skills are user data.**
SHA256SUMS ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ c20806b8e4dfc28e162efd1bc3d4cae42e8e5224aaeda7722562bf2b9539acf5 README.md
2
+ cf88d3c382ec0deaa9a89bb682da29bbf8822191c97d5da784de38bd3e817344 STATUS.md
3
+ 887cad558e8fde9d4c357f2cdae4507e4e614b1f0dbad190d1fa9d21714ad92f V1_1_COMPLETE.md
4
+ 3965991f7c62bfb29001f9b19f704deefbc890dc85649e4d72fd57243ab317f0 client_contract.md
5
+ 4710b258140647aee5399ce3158da7f1f29bea5cb8bb6ed3541be122d5e53064 inference_config.json
6
+ 4159a5a3cd7ed71c4da7a6712b2ec5049d7c1ec2e84cbe538178136e5e99d4f3 ir/adapter_config.json
7
+ 868d11b4360748cb3c493e26e2ee4cf4eef937eb0c9755988c364a741e5d3a82 ir/adapters.safetensors
8
+ 69abbc73e77287e6646bbc323a3fd6869218124b12512cd262a40d0b034ddda2 ir_honesty_fallback/adapter_config.json
9
+ 02b521c2348477cf03f667c7b500f0be82bfb937277806e3f4e562b9593a1bbe ir_honesty_fallback/adapters.safetensors
10
+ 4290d51b5ad2ffc89ff22086d2d6aede91485ea4c4f1ecbe2ecd122520a05e4a manifest.json
11
+ b3b4a8eaa9bef08c32c608f538c1e176acc41f49d18d66aa7c36673123746af9 product_scorecard.json
12
+ 8856981bbea72862e2d44a6d5f4de9e540e1793ed1674fcc0dd7ace2364be5f0 router.json
13
+ 12db4143f37da30858061eb64bf3fb645d15e195bb18b9274f3620640eb63f37 skill_store/index.json
14
+ f18e2b92a8264142df82780fa0757c5c6aa60569e364a824a1e2029787a81378 skill_store/skills/invoice_chase.json
15
+ 55715a59fbdc06b0656d20ace72181dda4142d6c8edbe791b3752c71f4510566 skill_store/skills/morning_focus.json
16
+ a025338ad42f4fee0725f6e8bbd5bf2384a42973ab847838bd9a54526f64ac22 skill_store/skills/standup_post.json
17
+ ceb709ccf7a40ea608c5cc74c247071bbcb0980017f1811f7c55604b4241ab7c writer/promoted_core_100.safetensors
18
+ 734e75c575696d88ec67283d23f8dbeb87a03c3c0e45e0da6b4cfa531036cb4e writer_unified/adapter_config.json
19
+ 2db8a19242ab84fb4b64820528509c3eb842c998f53247e6cf13999b0651b955 writer_unified/adapters.safetensors
STATUS.md ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # loudink-v1.1 status — **PR-A→E complete**
2
+
3
+ Last updated: 2026-07-08
4
+
5
+ ## Hugging Face
6
+
7
+ | Line | Repo | Role |
8
+ |------|------|------|
9
+ | **Stable GA** | [nsalerni/loudink-v1](https://huggingface.co/nsalerni/loudink-v1) | **0.4.0** freeze |
10
+ | **Canary** | [nsalerni/loudink-v1.1](https://huggingface.co/nsalerni/loudink-v1.1) | **1.1.0** skills + expanded daily-mac |
11
+
12
+ Rebuild canary:
13
+
14
+ ```bash
15
+ python -m gemmaflow_tune.cli.build_loudink_v1_1_publish --force
16
+ python -m gemmaflow_tune.cli.publish_sota --model loudink-v1.1 \
17
+ --commit-message "loudink-v1.1 1.1.0: skills PR-A–E canary"
18
+ ```
19
+
20
+ ## PR board
21
+
22
+ | PR | Deliverable | Status |
23
+ |----|-------------|--------|
24
+ | **PR-A** | Skill store + recorder schema + compiler + null-safe IR | **done** |
25
+ | **PR-B** | Paraphrase invoke + skill bench + IR labels + runner wiring | **done** (19/19) |
26
+ | **PR-C** | Slot fill (`for` / `about` / named) | **done** |
27
+ | **PR-D** | Daily-mac expand (Focus/DND, Reminders, reply, tabs, Notion/Linear, writing) | **done** (69/69) |
28
+ | **PR-E** | Vision fallback scaffold (disabled by default) | **done** |
29
+
30
+ ## Headline metrics (canary)
31
+
32
+ | Metric | Bar | Result |
33
+ |--------|-----|--------|
34
+ | Skill invoke (n=19) | ≥95% named / ≥85% paraphrase | **100%** shipped |
35
+ | Daily-Mac overall (n=69) | no drop vs 0.4 | **100%** shipped |
36
+ | Writing neural | hold ≥80% | **92%** |
37
+ | Writing p50 | ≤250 ms | **171 ms** |
38
+ | Computer / multi-step | hold 100% | **100%** |
39
+ | IR honesty (n=112) | ≥45% neural | **46.4%** (v0.4 lineage) |
40
+
41
+ ### Daily-Mac scorecard (v1.1 expanded)
42
+
43
+ | Slice | Shipped | Neural | p50 |
44
+ |-------|---------|--------|-----|
45
+ | Writing (n=25) | **100%** | **92%** | **171 ms** |
46
+ | Computer (n=44) | **100%** | — | ~0 ms FP |
47
+ | Multi-step (n=25) | **100%** | — | ~0 ms FP |
48
+ | **Overall (n=69)** | **100%** | — | mean ~60 ms |
49
+
50
+ Scorecard: `artifacts/loudink_v1/product_scorecard.json`
51
+ Skill bench: `artifacts/benchmarks/loudink_v1_1/skill_invoke/`
52
+
53
+ ## Production stack (v1.1 canary)
54
+
55
+ ```
56
+ writer: artifacts/sft_loudink_v1_rft_daily/adapters
57
+ polish: structural (+ daily rules)
58
+ ir: artifacts/sft_loudink_v1_1_skill_invoke_ir/adapters
59
+ ir_fallback: artifacts/sft_loudink_v1_ir_honesty/adapters
60
+ skills: SkillStore (example seed in publish bundle)
61
+ runner: loudink_v1 + skill_store_path
62
+ bench: configs/benchmark_loudink_v1_daily_mac.yaml
63
+ configs/benchmark_loudink_v1_1_skill_invoke.yaml
64
+ ```
65
+
66
+ ## Out of scope (later product)
67
+
68
+ - Client recorder UI (Flowcast owns capture UX)
69
+ - Optional real vision weights/resolver
70
+ - AirDrop / Bluetooth / long-horizon 1:1 prep suites (roadmap backlog)
71
+ - Training cloud models on private user recordings (forbidden by default)
V1_1_COMPLETE.md ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # loudink-v1.1 complete (PR-A → PR-E)
2
+
3
+ **Version:** 1.1.0 canary
4
+ **Date:** 2026-07-08
5
+ **Stable freeze left intact:** loudink-v1 **0.4.0** at `nsalerni/loudink-v1`
6
+
7
+ ## Delivered
8
+
9
+ ### PR-A — Skill substrate
10
+ - `src/gemmaflow_tune/skills/{schema,store,recorder,compile}.py`
11
+ - Null-safe `run_skill` compile + sanitize (never invent skill_id)
12
+ - Unit tests: `tests/test_skills_pra.py`
13
+
14
+ ### PR-B — Invoke surface
15
+ - Paraphrase + exact alias match in `skills/invoke.py`
16
+ - Freeform disambiguation (open gmail ≠ skill hijack)
17
+ - Bench suite n=19 + IR SFT corpus
18
+ - Runner wiring: `skill_store_path` via `runner_factory`
19
+ - Unit tests: `tests/test_skills_prb.py`
20
+
21
+ ### PR-C — Slot fill
22
+ - Deterministic extract in `skills/slots.py`
23
+ - Seed skills: Invoice Chase (`company`), Standup Post (`update`)
24
+ - Scorer: `slot_values` / `skill_id`
25
+ - Unit tests: `tests/test_skills_prc_slots.py`
26
+
27
+ ### PR-D — Daily-Mac expand
28
+ - Computer: Focus/DND, Reminders, Messages/Mail reply, Chrome tabs, Notion+Linear, Wi‑Fi
29
+ - Writing: reply iMessage, email subject, code cell
30
+ - Resolvers: focus/DND, browser tabs, reply context
31
+ - **69/69** overall on expanded suite
32
+
33
+ ### PR-E — Vision scaffold
34
+ - `skills/vision.py`: `ScreenObservation`, `VisionFallbackConfig`, `try_vision_fallback`
35
+ - Default **disabled**; client injects resolver when ready
36
+
37
+ ## Verification commands
38
+
39
+ ```bash
40
+ .venv/bin/python -m pytest tests/test_skills_pra.py tests/test_skills_prb.py tests/test_skills_prc_slots.py -q
41
+ .venv/bin/python -m gemmaflow_tune.cli.prepare_skill_invoke_benchmarks
42
+ .venv/bin/python -m gemmaflow_tune.cli.prepare_daily_mac_benchmarks
43
+ GEMMAFLOW_GPU_MODE=shared .venv/bin/python -m gemmaflow_tune.cli.benchmark \
44
+ --config configs/benchmark_loudink_v1_1_skill_invoke.yaml --variant loudink_v1_1_skill_invoke
45
+ GEMMAFLOW_GPU_MODE=shared .venv/bin/python -m gemmaflow_tune.cli.benchmark \
46
+ --config configs/benchmark_loudink_v1_daily_mac.yaml --variant loudink_v1_daily_mac
47
+ .venv/bin/python -m gemmaflow_tune.cli.build_loudink_v1_product_scorecard \
48
+ --measurement artifacts/benchmarks/loudink_v1/daily_mac/loudink_v1_daily_mac_measurement.json \
49
+ --output artifacts/loudink_v1/product_scorecard.json
50
+ .venv/bin/python -m gemmaflow_tune.cli.build_loudink_v1_1_publish --force
51
+ .venv/bin/python -m gemmaflow_tune.cli.publish_sota --model loudink-v1.1
52
+ ```
53
+
54
+ ## Success metrics (all met)
55
+
56
+ | Metric | Bar | Result |
57
+ |--------|-----|--------|
58
+ | Skill invoke accuracy | ≥95% | **100%** (19/19) |
59
+ | Skill paraphrase | ≥85% | **100%** (suite includes paraphrase) |
60
+ | Freeform regression | no drop vs 0.4 | **100%** daily-mac |
61
+ | Writing neural / p50 | hold 0.4 bars | **92%** / **171 ms** |
62
+ | IR honesty | ≥45% | **46.4%** |
client_contract.md ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # loudink-v1 Flowcast client contract (PR13)
2
+
3
+ External dependency: Flowcast/GemmaFlow client must support dual packages before canary traffic.
4
+
5
+ ## Package selection
6
+
7
+ | Field | Type | Description |
8
+ |-------|------|-------------|
9
+ | `model_package` | enum | `v5_lite` (default production) \| `loudink_v1` |
10
+ | `kill_switch` | bool | Force `v5_lite` regardless of remote config |
11
+
12
+ ## Manifest fields the client must read
13
+
14
+ From `artifacts/manifests/loudink_v1.json` / published `manifest.json`:
15
+
16
+ - `runner_kind`: `loudink_v1`
17
+ - `writer_model_config` / adapter paths / `writer_chat_template_family`
18
+ - `ir_model_config` / adapter paths / `ir_chat_template_family`
19
+ - `polish_mode` (default `minimal`)
20
+ - `structural_polish_on_markers`
21
+ - `learned_router_path`
22
+ - `transcript_first_ir`, `intent_fast_path` (production true)
23
+ - `hot_download_mb_primary` / `hot_download_mb_hard`
24
+
25
+ ## Telemetry (optional but recommended)
26
+
27
+ | Event field | Description |
28
+ |-------------|-------------|
29
+ | `finish_reason` | Include polish/IR/intent tags |
30
+ | `neural_text_present` | bool — whether raw draft was produced |
31
+ | `polish_mode` | effective mode after markers |
32
+ | `package_version` | loudink-v1 semver |
33
+ | `latency_ms` | e2e |
34
+ | `model_invoked` | false when transcript polish/IR/intent FP skipped models |
35
+
36
+ ## Rollback
37
+
38
+ 1. Set `model_package=v5_lite` or `kill_switch=true`.
39
+ 2. Client must keep last-known-good v5-lite package on disk for offline rollback.
40
+ 3. Training repo does not own client release; this file is the interface contract.
41
+
42
+ ## Canary traffic gate
43
+
44
+ Do **not** route production users to loudink-v1 until:
45
+
46
+ 1. `gate_loudink_v1 --tier canary --gate-mode enforce` is green
47
+ 2. Client dual-package flag is shipped
48
+ 3. Package SHA256SUMS verified
49
+
50
+ ## loudink-v1.1 skills (canary package)
51
+
52
+ | Field | Type | Description |
53
+ |-------|------|-------------|
54
+ | `model_package` | enum | add `loudink_v1_1` canary; kill-switch → `loudink_v1` or `v5_lite` |
55
+ | `skill_store_path` | path | User-writable SkillStore root (do not overwrite with HF seed blindly) |
56
+ | `run_skill` IR | intent | `{"intent":"run_skill","skill_id":"…","slots":{…}}` — unknown id → null plan |
57
+ | `vision_fallback` | optional | Disabled by default; client injects resolver for non-AX UIs |
58
+
59
+ HF canary: `nsalerni/loudink-v1.1`. Example seed skills in bundle `skill_store/` are demos only.
inference_config.json ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_name": "loudink-v1.1",
3
+ "model_tag": "loudink-v1.1",
4
+ "product": "loudink-v1.1",
5
+ "version": "1.1.0",
6
+ "runner_kind": "loudink_v1",
7
+ "hf_repo": "nsalerni/loudink-v1.1",
8
+ "predecessor": "nsalerni/loudink-v1",
9
+ "writer_base_model": "mlx-community/LFM2.5-1.2B-Instruct-4bit",
10
+ "ir_base_model": "mlx-community/functiongemma-270m-it-4bit",
11
+ "writer_adapter_path": "writer",
12
+ "writer_checkpoint": "promoted_core_100.safetensors",
13
+ "writer_unified_adapter_path": "writer_unified",
14
+ "ir_adapter_path": "ir",
15
+ "ir_adapter_fallback": "ir_honesty_fallback",
16
+ "learned_router_path": "router.json",
17
+ "skill_store_path": "skill_store",
18
+ "use_learned_router": true,
19
+ "polish_mode": "structural",
20
+ "structural_polish_on_markers": true,
21
+ "transcript_first_ir": true,
22
+ "intent_fast_path": true,
23
+ "disable_fast_paths": false,
24
+ "writer_chat_template_family": "lfm25",
25
+ "ir_chat_template_family": "functiongemma",
26
+ "writer_use_prompt_kv_cache": true,
27
+ "json_early_stop": true,
28
+ "prompt_mode": "verbose",
29
+ "hot_download_mb_primary": 850,
30
+ "hot_download_mb_hard": 900,
31
+ "skill_features": {
32
+ "record_and_replay": true,
33
+ "paraphrase_invoke": true,
34
+ "slot_fill": true,
35
+ "vision_fallback_scaffold": true,
36
+ "vision_fallback_default_enabled": false
37
+ },
38
+ "metrics_v11": {
39
+ "daily_mac_overall_shipped": 1.0,
40
+ "daily_mac_writing_shipped": 1.0,
41
+ "daily_mac_writing_neural": 0.92,
42
+ "daily_mac_writing_p50_ms": 171,
43
+ "daily_mac_computer_shipped": 1.0,
44
+ "daily_mac_multi_step_shipped": 1.0,
45
+ "daily_mac_n": 69,
46
+ "skill_invoke_shipped": 1.0,
47
+ "skill_invoke_n": 19,
48
+ "ir_honesty_neural_n112": 0.4643
49
+ },
50
+ "stable_line": "loudink-v1",
51
+ "line": "canary"
52
+ }
ir/adapter_config.json ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "adapter_path": "artifacts/sft_loudink_v1_1_skill_invoke_ir/adapters",
3
+ "batch_size": 1,
4
+ "clear_cache_threshold": 0,
5
+ "config": null,
6
+ "data": "data/sft_loudink_v1_1_skill_invoke_ir",
7
+ "fine_tune_type": "lora",
8
+ "gpu_mode": "shared",
9
+ "grad_accumulation_steps": 8,
10
+ "grad_checkpoint": true,
11
+ "iters": 80,
12
+ "learning_rate": 1.2e-05,
13
+ "lora_parameters": {
14
+ "dropout": 0.05,
15
+ "keys": [
16
+ "self_attn.q_proj",
17
+ "self_attn.k_proj",
18
+ "self_attn.v_proj",
19
+ "self_attn.o_proj",
20
+ "mlp.gate_proj",
21
+ "mlp.up_proj",
22
+ "mlp.down_proj"
23
+ ],
24
+ "rank": 16,
25
+ "scale": 32.0
26
+ },
27
+ "lr_schedule": null,
28
+ "mask_prompt": true,
29
+ "max_seq_length": 2048,
30
+ "model": "/Users/nilptr/dev/open-source/finetune-rl-gemma/artifacts/models/functiongemma-270m-it-4bit",
31
+ "model_config": "configs/model_v4_functiongemma.yaml",
32
+ "model_hf_repo": "mlx-community/functiongemma-270m-it-4bit",
33
+ "model_local_path": "artifacts/models/functiongemma-270m-it-4bit",
34
+ "num_layers": 8,
35
+ "optimizer": "adamw",
36
+ "optimizer_config": {
37
+ "adam": {},
38
+ "adamw": {},
39
+ "muon": {},
40
+ "sgd": {},
41
+ "adafactor": {}
42
+ },
43
+ "project_name": null,
44
+ "report_to": null,
45
+ "resume_adapter_file": "artifacts/sft_loudink_v1_ir_honesty/adapters/adapters.safetensors",
46
+ "save_every": 20,
47
+ "seed": 17,
48
+ "steps_per_eval": 20,
49
+ "steps_per_report": 10,
50
+ "test": false,
51
+ "test_batches": 500,
52
+ "train": true,
53
+ "val_batches": 8
54
+ }
ir/adapters.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:868d11b4360748cb3c493e26e2ee4cf4eef937eb0c9755988c364a741e5d3a82
3
+ size 3386915
ir_honesty_fallback/adapter_config.json ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "adapter_path": "artifacts/sft_loudink_v1_ir_honesty/adapters",
3
+ "batch_size": 1,
4
+ "clear_cache_threshold": 0,
5
+ "config": null,
6
+ "data": "data/sft_loudink_v1_ir_honesty",
7
+ "fine_tune_type": "lora",
8
+ "gpu_mode": "shared",
9
+ "grad_accumulation_steps": 8,
10
+ "grad_checkpoint": true,
11
+ "iters": 120,
12
+ "learning_rate": 1.5e-05,
13
+ "lora_parameters": {
14
+ "dropout": 0.05,
15
+ "keys": [
16
+ "self_attn.q_proj",
17
+ "self_attn.k_proj",
18
+ "self_attn.v_proj",
19
+ "self_attn.o_proj",
20
+ "mlp.gate_proj",
21
+ "mlp.up_proj",
22
+ "mlp.down_proj"
23
+ ],
24
+ "rank": 16,
25
+ "scale": 32.0
26
+ },
27
+ "lr_schedule": null,
28
+ "mask_prompt": true,
29
+ "max_seq_length": 2048,
30
+ "model": "/Users/nilptr/dev/open-source/finetune-rl-gemma/artifacts/models/functiongemma-270m-it-4bit",
31
+ "model_config": "configs/model_v4_functiongemma.yaml",
32
+ "model_hf_repo": "mlx-community/functiongemma-270m-it-4bit",
33
+ "model_local_path": "artifacts/models/functiongemma-270m-it-4bit",
34
+ "num_layers": 8,
35
+ "optimizer": "adamw",
36
+ "optimizer_config": {
37
+ "adam": {},
38
+ "adamw": {},
39
+ "muon": {},
40
+ "sgd": {},
41
+ "adafactor": {}
42
+ },
43
+ "project_name": null,
44
+ "report_to": null,
45
+ "resume_adapter_file": "artifacts/sft_v5_functiongemma_ir_v5/adapters/adapters.safetensors",
46
+ "save_every": 20,
47
+ "seed": 41,
48
+ "steps_per_eval": 20,
49
+ "steps_per_report": 10,
50
+ "test": false,
51
+ "test_batches": 500,
52
+ "train": true,
53
+ "val_batches": 10
54
+ }
ir_honesty_fallback/adapters.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:02b521c2348477cf03f667c7b500f0be82bfb937277806e3f4e562b9593a1bbe
3
+ size 3386915
manifest.json ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "product": "loudink-v1.1",
3
+ "version": "1.1.0",
4
+ "pipeline_namespace": "loudink_v1_1",
5
+ "runner_kind": "loudink_v1",
6
+ "gate_mode": "warn",
7
+ "hf_repo": "nsalerni/loudink-v1.1",
8
+ "predecessor": "nsalerni/loudink-v1",
9
+ "writer_model_config": "configs/model_v5_lfm25_1_2b.yaml",
10
+ "writer_base_model": "mlx-community/LFM2.5-1.2B-Instruct-4bit",
11
+ "writer_adapter_path": "writer",
12
+ "writer_checkpoint": "promoted_core_100.safetensors",
13
+ "writer_unified_adapter_path": "writer_unified",
14
+ "writer_use_prompt_kv_cache": true,
15
+ "writer_chat_template_family": "lfm25",
16
+ "ir_model_config": "configs/model_v4_functiongemma.yaml",
17
+ "ir_base_model": "mlx-community/functiongemma-270m-it-4bit",
18
+ "ir_adapter_path": "ir",
19
+ "ir_adapter_fallback": "ir_honesty_fallback",
20
+ "ir_checkpoint": "adapters.safetensors",
21
+ "ir_prompt_mode": "verbose",
22
+ "ir_use_prompt_kv_cache": true,
23
+ "ir_max_tokens": 96,
24
+ "ir_chat_template_family": "functiongemma",
25
+ "learned_router_path": "router.json",
26
+ "use_learned_router": true,
27
+ "transcript_first_ir": true,
28
+ "intent_fast_path": true,
29
+ "disable_fast_paths": false,
30
+ "skill_store_path": "skill_store",
31
+ "skill_features": {
32
+ "record_and_replay": true,
33
+ "paraphrase_invoke": true,
34
+ "slot_fill": true,
35
+ "vision_fallback_scaffold": true,
36
+ "vision_fallback_default_enabled": false
37
+ },
38
+ "polish_mode": "structural",
39
+ "structural_polish_on_markers": true,
40
+ "prompt_mode": "verbose",
41
+ "json_early_stop": true,
42
+ "hot_download_mb_primary": 850,
43
+ "hot_download_mb_hard": 900,
44
+ "architecture": "C_dual_writer_ir_skills",
45
+ "suite_versions": {
46
+ "daily_mac": "daily_mac_v1_1_n69",
47
+ "skill_invoke": "skill_invoke_v1_n19",
48
+ "user_demand_ir": "n112_v1"
49
+ },
50
+ "metrics_v11": {
51
+ "daily_mac_overall_shipped": 1.0,
52
+ "daily_mac_writing_shipped": 1.0,
53
+ "daily_mac_writing_neural": 0.92,
54
+ "daily_mac_writing_p50_ms": 171,
55
+ "daily_mac_computer_shipped": 1.0,
56
+ "daily_mac_multi_step_shipped": 1.0,
57
+ "daily_mac_n": 69,
58
+ "skill_invoke_shipped": 1.0,
59
+ "skill_invoke_n": 19,
60
+ "ir_honesty_neural_n112": 0.4643
61
+ },
62
+ "notes": "1.1.0 canary: PR-A skill store/recorder/compiler; PR-B paraphrase invoke + IR labels; PR-C slot fill; PR-D expanded daily-mac (Focus/DND, Reminders, reply, tabs, Notion/Linear, writing reply/code); PR-E vision fallback scaffold (disabled by default). Holds v0.4 bars and exceeds writing neural on expanded suite."
63
+ }
product_scorecard.json ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "reports": [
3
+ {
4
+ "source": "artifacts/benchmarks/loudink_v1/daily_mac/loudink_v1_daily_mac_measurement.json",
5
+ "label": "loudink-v1 v0.4 daily-mac product",
6
+ "writing": {
7
+ "shipped": {
8
+ "total": 25,
9
+ "passed": 25,
10
+ "accuracy": 1.0
11
+ },
12
+ "neural": {
13
+ "total": 25,
14
+ "passed": 23,
15
+ "accuracy": 0.92,
16
+ "missing": 0
17
+ },
18
+ "polish_lift": 0.07999999999999996,
19
+ "latency": {
20
+ "n": 25,
21
+ "mean": 166.6401715839654,
22
+ "p50": 171.05649993754923,
23
+ "p95": 332.83937512896955,
24
+ "max": 383.80437484011054,
25
+ "model_invoked_p50": 176.41600011847913,
26
+ "model_invoked_p95": 332.83937512896955,
27
+ "model_invoked_n": 20,
28
+ "fast_path_rate": 0.19999999999999996
29
+ }
30
+ },
31
+ "computer": {
32
+ "shipped": {
33
+ "total": 44,
34
+ "passed": 44,
35
+ "accuracy": 1.0
36
+ },
37
+ "neural": {
38
+ "total": 44,
39
+ "passed": 0,
40
+ "accuracy": 0.0,
41
+ "missing": 44
42
+ },
43
+ "latency": {
44
+ "n": 44,
45
+ "mean": 0.05,
46
+ "p50": 0.05,
47
+ "p95": 0.05,
48
+ "max": 0.05,
49
+ "model_invoked_p50": 0.0,
50
+ "model_invoked_p95": 0.0,
51
+ "model_invoked_n": 0,
52
+ "fast_path_rate": 1.0
53
+ }
54
+ },
55
+ "multi_step": {
56
+ "shipped": {
57
+ "total": 25,
58
+ "passed": 25,
59
+ "accuracy": 1.0
60
+ },
61
+ "latency": {
62
+ "n": 25,
63
+ "mean": 0.05,
64
+ "p50": 0.05,
65
+ "p95": 0.05,
66
+ "max": 0.05,
67
+ "model_invoked_p50": 0.0,
68
+ "model_invoked_p95": 0.0,
69
+ "model_invoked_n": 0,
70
+ "fast_path_rate": 1.0
71
+ },
72
+ "n": 25
73
+ },
74
+ "overall": {
75
+ "shipped": {
76
+ "total": 69,
77
+ "passed": 69,
78
+ "accuracy": 1.0
79
+ },
80
+ "latency": {
81
+ "n": 69,
82
+ "mean": 60.40875782027732,
83
+ "p50": 0.05,
84
+ "p95": 323.94058303907514,
85
+ "max": 383.80437484011054,
86
+ "model_invoked_p50": 176.41600011847913,
87
+ "model_invoked_p95": 332.83937512896955,
88
+ "model_invoked_n": 20,
89
+ "fast_path_rate": 0.7101449275362319
90
+ }
91
+ },
92
+ "finish_reasons": {
93
+ "transcript_ir_fast_path": 44,
94
+ "loudink_v1_structural_polish": 20,
95
+ "transcript_polish_fast_path": 5
96
+ }
97
+ }
98
+ ]
99
+ }
publish_report.json ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "hf_repo": "nsalerni/loudink-v1.1",
3
+ "output_dir": "artifacts/hf_publish/loudink-v1.1",
4
+ "version": "1.1.0",
5
+ "measured_adapter_bundle_mib": 70.14,
6
+ "files": [
7
+ "README.md",
8
+ "SHA256SUMS",
9
+ "STATUS.md",
10
+ "V1_1_COMPLETE.md",
11
+ "client_contract.md",
12
+ "inference_config.json",
13
+ "ir/adapter_config.json",
14
+ "ir/adapters.safetensors",
15
+ "ir_honesty_fallback/adapter_config.json",
16
+ "ir_honesty_fallback/adapters.safetensors",
17
+ "manifest.json",
18
+ "product_scorecard.json",
19
+ "router.json",
20
+ "skill_store/index.json",
21
+ "skill_store/skills/invoice_chase.json",
22
+ "skill_store/skills/morning_focus.json",
23
+ "skill_store/skills/standup_post.json",
24
+ "writer/promoted_core_100.safetensors",
25
+ "writer_unified/adapter_config.json",
26
+ "writer_unified/adapters.safetensors"
27
+ ]
28
+ }
router.json ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "weights": {
3
+ "repair": {
4
+ "bias": 5.810288559009208,
5
+ "settings_pane": 2.5,
6
+ "open_prefix": -0.41745491159245274,
7
+ "automation_imperative": 3.726646453176461,
8
+ "word_count": -9.84929312552456,
9
+ "longform_signal": -1.1154836678961781,
10
+ "dictation_prose": 1.9345009743844221,
11
+ "filler_start": 1.2838928202621513,
12
+ "and_chain": 0.20859939463580085
13
+ },
14
+ "compact_ir": {
15
+ "bias": -3.640176689795005,
16
+ "and_chain": 0.35054606918952846,
17
+ "automation_imperative": 0.5592421853520967,
18
+ "open_prefix": -0.21733854149982806,
19
+ "word_count": -1.0103340242208811,
20
+ "settings_pane": 0.0,
21
+ "longform_signal": -0.05044327857241728,
22
+ "dictation_prose": -0.03462361505802813,
23
+ "filler_start": -0.038948122633683704
24
+ },
25
+ "longform_writer": {
26
+ "bias": -7.6502815198369145,
27
+ "longform_signal": 3.13050955434213,
28
+ "word_count": 13.274936614626753,
29
+ "dictation_prose": 0.7390766344993486,
30
+ "automation_imperative": -0.518431811263042,
31
+ "settings_pane": 0.0,
32
+ "open_prefix": -0.4527758645205938,
33
+ "filler_start": -0.17652712925511643,
34
+ "and_chain": 1.209884306661929
35
+ },
36
+ "writer": {
37
+ "bias": 5.680169650622764,
38
+ "filler_start": 0.4315824316266496,
39
+ "dictation_prose": -0.43895399382574257,
40
+ "word_count": -0.7153094648814279,
41
+ "automation_imperative": -1.4674568272655135,
42
+ "settings_pane": 0.0,
43
+ "longform_signal": 1.035417392126457,
44
+ "open_prefix": 2.8875693176128885,
45
+ "and_chain": 0.030970229512743263
46
+ }
47
+ },
48
+ "meta": {
49
+ "seed": "copied_from_v5_lite",
50
+ "source": "artifacts/v5_lite/router.json",
51
+ "product": "loudink-v1",
52
+ "notes": "Refit with labeled transcripts after PR8p/PR9p promote"
53
+ }
54
+ }
skill_store/index.json ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": "1.1.0-pra",
3
+ "skills": [
4
+ {
5
+ "skill_id": "invoice_chase",
6
+ "name": "Invoice Chase",
7
+ "aliases": [
8
+ "run invoice chase",
9
+ "chase invoices"
10
+ ],
11
+ "source": "user_recording",
12
+ "skill_version": 1,
13
+ "risk": "low"
14
+ },
15
+ {
16
+ "skill_id": "morning_focus",
17
+ "name": "Morning Focus",
18
+ "aliases": [
19
+ "start my morning focus",
20
+ "morning focus workflow"
21
+ ],
22
+ "source": "user_recording",
23
+ "skill_version": 1,
24
+ "risk": "low"
25
+ },
26
+ {
27
+ "skill_id": "standup_post",
28
+ "name": "Standup Post",
29
+ "aliases": [
30
+ "post standup",
31
+ "daily standup slack"
32
+ ],
33
+ "source": "user_recording",
34
+ "skill_version": 1,
35
+ "risk": "low"
36
+ }
37
+ ]
38
+ }
skill_store/skills/invoice_chase.json ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "skill_id": "invoice_chase",
3
+ "name": "Invoice Chase",
4
+ "aliases": [
5
+ "run invoice chase",
6
+ "chase invoices"
7
+ ],
8
+ "source": "user_recording",
9
+ "created_at": "2026-07-09T05:42:10+00:00",
10
+ "skill_version": 1,
11
+ "schema_version": "1.1.0-pra",
12
+ "steps": [
13
+ {
14
+ "type": "open_url",
15
+ "url": "https://mail.google.com",
16
+ "browser": "chrome"
17
+ },
18
+ {
19
+ "type": "wait",
20
+ "milliseconds": 1000
21
+ },
22
+ {
23
+ "type": "browser_insert_text",
24
+ "text": "invoice overdue",
25
+ "browser": "chrome"
26
+ }
27
+ ],
28
+ "slots": [
29
+ {
30
+ "name": "company",
31
+ "prompt": "company name",
32
+ "bind": "steps[2].text",
33
+ "required": true,
34
+ "default": null
35
+ }
36
+ ],
37
+ "risk": "low",
38
+ "requires_confirmation": false,
39
+ "notes": ""
40
+ }
skill_store/skills/morning_focus.json ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "skill_id": "morning_focus",
3
+ "name": "Morning Focus",
4
+ "aliases": [
5
+ "start my morning focus",
6
+ "morning focus workflow"
7
+ ],
8
+ "source": "user_recording",
9
+ "created_at": "2026-07-09T05:42:10+00:00",
10
+ "skill_version": 1,
11
+ "schema_version": "1.1.0-pra",
12
+ "steps": [
13
+ {
14
+ "type": "launch_application",
15
+ "app_name": "Shortcuts"
16
+ },
17
+ {
18
+ "type": "wait",
19
+ "milliseconds": 800
20
+ },
21
+ {
22
+ "type": "type_text",
23
+ "text": "Morning Focus"
24
+ },
25
+ {
26
+ "type": "keystroke",
27
+ "key": "return",
28
+ "modifiers": []
29
+ }
30
+ ],
31
+ "slots": [],
32
+ "risk": "low",
33
+ "requires_confirmation": false,
34
+ "notes": ""
35
+ }
skill_store/skills/standup_post.json ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "skill_id": "standup_post",
3
+ "name": "Standup Post",
4
+ "aliases": [
5
+ "post standup",
6
+ "daily standup slack"
7
+ ],
8
+ "source": "user_recording",
9
+ "created_at": "2026-07-09T05:42:10+00:00",
10
+ "skill_version": 1,
11
+ "schema_version": "1.1.0-pra",
12
+ "steps": [
13
+ {
14
+ "type": "launch_application",
15
+ "app_name": "Slack"
16
+ },
17
+ {
18
+ "type": "wait",
19
+ "milliseconds": 600
20
+ },
21
+ {
22
+ "type": "type_text",
23
+ "text": "standup update"
24
+ }
25
+ ],
26
+ "slots": [
27
+ {
28
+ "name": "update",
29
+ "prompt": "standup text",
30
+ "bind": "steps[2].text",
31
+ "required": false,
32
+ "default": "standup update"
33
+ }
34
+ ],
35
+ "risk": "low",
36
+ "requires_confirmation": false,
37
+ "notes": ""
38
+ }
writer/promoted_core_100.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ceb709ccf7a40ea608c5cc74c247071bbcb0980017f1811f7c55604b4241ab7c
3
+ size 44453426
writer_unified/adapter_config.json ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "adapter_path": "artifacts/sft_loudink_v1_rft_daily/adapters",
3
+ "batch_size": 1,
4
+ "clear_cache_threshold": 0,
5
+ "config": null,
6
+ "data": "data/sft_loudink_v1_rft_daily_micro",
7
+ "fine_tune_type": "lora",
8
+ "gpu_mode": "shared",
9
+ "grad_accumulation_steps": 8,
10
+ "grad_checkpoint": true,
11
+ "iters": 50,
12
+ "learning_rate": 5e-07,
13
+ "lora_parameters": {
14
+ "dropout": 0.05,
15
+ "keys": [
16
+ "self_attn.q_proj",
17
+ "self_attn.k_proj",
18
+ "self_attn.v_proj",
19
+ "self_attn.out_proj",
20
+ "conv.in_proj",
21
+ "conv.out_proj",
22
+ "feed_forward.w1",
23
+ "feed_forward.w2",
24
+ "feed_forward.w3"
25
+ ],
26
+ "rank": 16,
27
+ "scale": 32.0
28
+ },
29
+ "lr_schedule": null,
30
+ "mask_prompt": true,
31
+ "max_seq_length": 2048,
32
+ "model": "/Users/nilptr/dev/open-source/finetune-rl-gemma/artifacts/models/lfm2.5-1.2b-instruct-4bit",
33
+ "model_config": "configs/model_v5_lfm25_1_2b.yaml",
34
+ "model_hf_repo": "mlx-community/LFM2.5-1.2B-Instruct-4bit",
35
+ "model_local_path": "artifacts/models/lfm2.5-1.2b-instruct-4bit",
36
+ "num_layers": 8,
37
+ "optimizer": "adamw",
38
+ "optimizer_config": {
39
+ "adam": {},
40
+ "adamw": {},
41
+ "muon": {},
42
+ "sgd": {},
43
+ "adafactor": {}
44
+ },
45
+ "project_name": null,
46
+ "report_to": null,
47
+ "resume_adapter_file": "artifacts/sft_loudink_v1_rft_daily/adapters/adapters.safetensors",
48
+ "save_every": 25,
49
+ "seed": 35,
50
+ "steps_per_eval": 25,
51
+ "steps_per_report": 10,
52
+ "test": false,
53
+ "test_batches": 500,
54
+ "train": true,
55
+ "val_batches": 4
56
+ }
writer_unified/adapters.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2db8a19242ab84fb4b64820528509c3eb842c998f53247e6cf13999b0651b955
3
+ size 22292714