Downloads · 30 days
0
Mihai-LeanZero/Qwen3.8-27B-Atlassian-lora
Qwen3.8-27B-Atlassian-lora is a text generation model from Mihai-LeanZero. Use it when you need the model to write or continue text. It is set up for mlx. The card lists the license as apache-2.0.
The LoRA adapter (rank 128 on 32 blocks) behind Qwen3.8-27B-Atlassian-Q8-mlx, for people who want to apply it to the base themselves with mlx-lm or Rapid-MLX.
Downloads · 30 days
0
Access
Public
Updated Nov 5, 2026
Repo size
2 GB
Likes
0
Public
Click a slice to open those files.
.safetensors1.6 GB · 100%
From the Hugging Face model README
The LoRA adapter (rank 128 on 32 blocks) behind Qwen3.8-27B-Atlassian-Q8-mlx, for people who want to apply it to the base themselves with mlx-lm or Rapid-MLX.
Release v0.5. The full write-up, with every test explained and every round compared, is on LeanZero's page: leanzero.net/portfolio/atlassian-models. The same evidence is reproduced below.
Built by LeanZero, the people behind CogniRunner (AI workflow rules for Jira), Sentinel Vault (Confluence attachment governance), LeanZero Management (PPM for Jira Cloud) and Atlassian migrations. Quantised with mlx-node and mlx-lm, trained with mlx-lm, served and evaluated with LeanZero's Rapid-MLX fork (engine wheel), all on one Apple Silicon Mac Studio.
The adapter alone (rank 128, scale 2.0, 32 of 64 blocks, all linear modules, ~1602 MB) for the 8-bit MLX base Mihai-LeanZero/Qwen3.8-27B-Atlassian-Q8-base-mlx. mlx-lm resolves adapters from a local folder only, so download it first. If you want a single folder instead, use Qwen3.8-27B-Atlassian-Q8-mlx.
Round 1: ~3.7M tokens, two epochs. Twelve Forge apps written by LeanZero plus five forge-sim fixtures; 175 module manifests generated from the @forge/manifest 13.4 schema and validated with Atlassian's validator, with task-description and fix-the-manifest pairs; UI Kit component examples (@forge/react 12) that compile against the real type definitions; facts from 1,820 Forge documentation sections, kept only when the answer is a verbatim quote; endpoint and scope facts from the Jira, Jira Software, JSM, Assets, Admin and Confluence OpenAPI specs; 1,400 vetted question-answer pairs from LeanZero's community-research compendium and 337 answers LeanZero posted on the Atlassian communities; 220 public Atlassian Developer Community threads (question plus accepted answer); a 7% general-code replay slice. Round 3 (this release): 1500 further steps on 5.45M tokens: the round-1 mix as replay, the documentation itself as reading material (4,117 sections), and the model's own generated apps kept only when they passed the manifest validator, the allow-list and tsc (380 complete apps) plus 51 manifests that passed the validator and allow-list (rejection-sampled fine-tuning).Round 3: 1500 steps from the round-2 adapter on 6.1M tokens (m7): a second, harder rejection-sampling harvest (4 apps for each of 450 briefs, 72% passed every gate, 937 kept) plus 362 fix-this-manifest pairs built from failures whose sibling passed, with the validator's real messages as the prompt. Round 4: two full epochs (4500 steps) of the same m7 mix from the round-3 adapter at a higher learning rate, the recipe the 9B run had shown to work; a real gain (14 of 25 complete apps) but below the 20/20 publish bar, so never released. Round 5: 2400 steps (1.4 epochs) from the round-4 adapter on 5.2M tokens (m8): a third rejection-sampling harvest aimed at the briefs that had never passed (backend-only phrasings, scheduled triggers, queues; 4 apps for each of 450 briefs, 63% passed, 810 kept), 439 validator-gated drills for the module types the mix had starved (workflow validators and post-functions, queue consumers, scheduled triggers, Confluence space pages), 245 more fix pairs from the model's own mistakes, and the earlier mixes as replay. A DPO experiment on 743 same-brief pass/fail pairs between rounds 4 and 5 collapsed the model's file layout (2 of 25) and was rejected; this round starts from the round-4 adapter instead. Round 6 (this release): the round-5 adapter expanded from 16 blocks at rank 32 to all 32 trainable blocks at rank 128 (400M parameters from 47M), then 2600 steps (1.07 epochs) on 7.5M tokens (m10): the endpoint and community-answer sources uncapped (3,813 and 1,748 rows), the general slice replaced by the untouched base's own answers to 2,700 human prompts (self-distilled) plus the earlier code files, at 20% of rows. Anchored fine-tuning: on every knowledge and drill row a KL penalty to the round-5 model's top-32 next-token predictions, on every general row to the base's, so the added capacity could not spend itself on forgetting; learning rate 1e-5 with cosine decay; the clean held-out set scored every 100 steps as the stop rule, never breached (1.231 at step 100 to 1.011 at 2500; round 5 was 1.326). The same capacity without the anchor (T8, 2400 steps at 2e-5) wrote as many apps at its best checkpoint but lost 0.135 on that set and was not released.
Against the untouched base on the same harness: Atlassian identifier probe 85% vs 15% (facts before 2026-04) and 15% vs 23% (facts after), thinking on; with thinking off, served: 85% / 31%. Forge shape tasks (a complete app from a one-line brief, thinking OFF, served through Rapid-MLX): 31.3 of 35 manifests pass Atlassian's validator (base 0 in its best mode) and 30.0 of 35 complete apps also compile under tsc against the real @forge/* types (base 0) (mean of 3 samples per brief). Looping battery (40 prompts x 4 sampling legs, 2048 tokens): genuine loops 0 / 0 / 1 / 0 vs base 2 / 1 / 3 / 4, non-termination 38 / 30 / 35 / 13% vs 60 / 48 / 53 / 25%. Long context: needle recall 100% at 4k, 100% at 32k, 100% at 128k; loop leg at 32k/128k (genuine loops, non-terminated of 4): 32k 0/4 vs base 0/4; 128k 0/4 vs base 1/4. Validation loss on the clean held-out set (130 rows no round trained on): 1.007 (round-1 adapter 1.207, untouched base 2.396). Merged 8-bit model vs base+adapter (top-1024 KLD, 200 prompts): 0.0339, top-1 99.56%. MTP on the merged model in Rapid-MLX, single stream: draft acceptance 58% (untouched base 53% on the same benchmark), decode speedup 1.45x at 128, 1.38x at 2048, 1.38x at 8192, 1.27x at 32768 (32.2 tok/s at short context). LM Studio MLX engine: loaded the folder and answered a Forge question (gate PASS).
Same harness, same prompts, same machine. Each round starts from the previous winner's adapter (T2 from T1, T3 from T1, T4 from T3, T5 from T4, T6 from T5, T7 from T5, T8-27B-CAP32 from T7, T9-27B-ANCHOR from T7). T2 and T6 were experiments that the rule rejected; T5 was a real gain over T4 but stayed below the 20/20 publish bar; T8 was the capacity run (adapter on 32 blocks at rank 128) that wrote more apps and lost held-out API-fact recall; T9 is the same capacity with the anchored recipe, the current release. From T9 the shape gate is 35 briefs with 3 samples each and the publish bar 30 of 35 apps and 30 of 35 manifests; T7 re-scored on that gate reads 22.7 and 30.7, single passes on 35 briefs moved by up to 7 apps between runs.
| test | untouched base | T1 | T2 (experiment, rejected) | T3 | T4 | T5 (not released: below the 20/20 bar) | T6 (DPO experiment, rejected) | T7 (v0.4) | T8 (capacity run, not released: knowledge guard) | T9 (v0.5) |
|---|---|---|---|---|---|---|---|---|---|---|
| trained from / mix / steps | - | base / m3 / 2500 | t1 / m4 / 400 | t1 / m6 / 1500 | t3 / m7 / 1500 | t4 / m7 / 4500 | t5 / DPO pairs / 91 | t5 / m8 / 2400 | t7 / m8 / 2400 | t7 / m10 / 2600 |
| training hours (this round) | 0 | 11.3 | n/a | 7.1 | 7.6 | 22.7 | 3.3 | 13.5 | 18.8 | 23.2 |
| val loss, clean held-out set (130 rows in no round's training data), lower is better | 2.396 | 1.207 | n/a | 1.209 | 1.208 | 1.260 | 1.295 | 1.326 | 1.461 | 1.007 |
| val loss, round-1 split (m3; later rounds trained on 82% of it, so only T1 is clean here) | n/a | 0.874 | n/a | 0.844 | 0.825 | 0.683 | 0.696 | 0.670 | 0.652 | 0.631 |
| val loss, round-3 mix (m6) | n/a | 0.686 | n/a | 0.632 | 0.596 | 0.481 | 0.487 | 0.453 | 0.434 | 0.425 |
| identifiers pre-2026-04 / post, thinking on | 15% / 23% | 77% / 31% | 62% / 31% | 69% / 23% | 69% / 23% | 62% / 31% | 77% / 38% | 85% / 23% | 54% / 23% | 85% / 15% |
| identifiers, thinking off (served) | n/a | 62% / 15% | n/a | 85% / 31% | 62% / 31% | 77% / 62% | 85% / 46% | 69% / 54% | 69% / 54% | 85% / 31% |
| manifests valid (of the round's briefs: 25 up to T8, 35 x 3 samples from T9, mean) | 0 of 25 | 14 of 25 | n/a | 13 of 25 | 14 of 25 | 15 of 25 | 7 of 25 | 23 of 25 | 24 of 25 | 31.3 of 35 |
| complete app passes every gate (same briefs) | 0 of 25 | 3 of 25 | n/a | 11 of 25 | 12 of 25 | 14 of 25 | 2 of 25 | 21 of 25 | 24 of 25 | 30.0 of 35 |
| loops per leg (official / t0.6 / greedy / instruct) | 2 / 1 / 3 / 4 | 2 / 1 / 2 / 0 | 0 / 0 | 2 / 0 / 0 / 0 | 0 / 0 / 1 / 0 | 0 / 0 / 0 / 0 | n/a | 2 / 0 / 1 / 0 | 1 / 0 / 2 / 0 | 0 / 0 / 1 / 0 |
| non-termination per leg | 60 / 48 / 53 / 25% | 20 / 20 / 13 / 10% | 20 / 28% | 20 / 18 / 10 / 15% | 25 / 15 / 28 / 13% | 23 / 15 / 15 / 13% | n/a | 20 / 25 / 23 / 5% | 20 / 15 / 28 / 0% | 38 / 30 / 35 / 13% |
| long context 32k / 128k | 32k 0 loops, 4/4 cut off; 128k 1 loops, 4/4 cut off | 32k 0 loops, 1/4 cut off; 128k 0 loops, 2/4 cut off | n/a | 32k 0 loops, 1/4 cut off; 128k 0 loops, 0/4 cut off | 32k 0 loops, 2/4 cut off; 128k 0 loops, 2/4 cut off | 32k 0 loops, 3/4 cut off; 128k 1 loops, 3/4 cut off | n/a | 32k 0 loops, 1/4 cut off; 128k 1 loops, 4/4 cut off | 32k 0 loops, 3/4 cut off; 128k 0 loops, 1/4 cut off | 32k 0 loops, 4/4 cut off; 128k 0 loops, 4/4 cut off |
| needle recall | 4k 100%, 32k 100%, 128k 100% | 4k 100%, 32k 100%, 128k 100% | n/a | 4k 100%, 32k 100%, 128k 100% | 4k 100%, 32k 100%, 128k 100% | n/a | n/a | 4k 100%, 32k 100%, 128k 100% | n/a | 4k 100%, 32k 100%, 128k 100% |
| leak probe: regex matches / memorised | 34 / 0 | n/a | n/a | 26 / 0 | 20 / 0 | 58 / 0 | n/a | 23 / 0 | 61 / 0 | 32 / 0 |
| merged 8-bit vs base+adapter: KLD / top-1 | not built | not built | not built | 0.0452 / 99.37% | 0.0407 / 99.43% | not built | not built | 0.0379 / 99.41% | not built | 0.0339 / 99.56% |
| MTP acceptance / speedup at 128, 2k, 8k, 32k | 53% / 1.55x, 1.53x, 1.23x, 1.22x | n/a | n/a | 53% / 1.3x, 1.34x, 1.36x, 1.22x | 51% / 1.26x, 1.38x, 1.34x, 1.21x | n/a | n/a | 59% / 1.22x, 1.22x, 1.13x, 1.16x | n/a | 58% / 1.45x, 1.38x, 1.38x, 1.27x |
| LM Studio load | n/a | n/a | n/a | PASS | PASS | n/a | n/a | PASS | n/a | PASS |
probe/pick_adapter.py)A round replaces the previous winner only if all four hold: no regression on the clean held-out set beyond 0.010; identifiers with thinking on within one question; at least three more complete apps passing every gate than the incumbent, over the publish bar (20 of 25 up to T8; 30 of 35 apps and 30 of 35 manifests, mean of 3 samples per brief, from T9) and manifests within two; loops at or below the untouched base on every leg with non-termination not more than 5 points above it.
Corrections to a decision, with the evidence:
Parity is a chain of three measured links, each inside the tool that can measure it: the adapter merged into the original bf16 reproduces the MLX base-plus-adapter greedily (AGREE 16/20 identical; mean common-prefix fraction 0.888); the lossless bf16 GGUF reproduces mlx-lm across runtimes (AGREE 17/20 identical; mean common-prefix fraction 0.945); each quant is scored against the bf16 GGUF's own logits with llama-perplexity (Q8_0 mean KLD 0.000842, Q6_K 0.00306 on 40 x 2048 held-out tokens). Then the same probes through llama-server on the Q8_0 file: identifiers thinking on 85% / 15%; SHAPE35 gguf-Q8_0 | apps 28.7/35 manifests 30.3/35 (mean of 3); loops think_official 0/40 (non-termination 33%), think_t06 0/40 (non-termination 33%), greedy 1/40 (non-termination 33%), instruct_nopenalty 0/40 (non-termination 13%); draft decoding on Metal: MTP none: 20.9 tok/s over 1280 tokens (5 prompts, 256 max, temp 0, wall incl. prefill); MTP draft-mtp: 19.6 tok/s over 1280 tokens (5 prompts, 256 max, temp 0, wall incl. prefill); thinking-off switch: THINK_OFF_KWARG HONOURED | reasoning chars 0 | content: `jir.
Rapid-MLX (LeanZero's fork, the engine inside Elzi, our desktop agent app)
rapid-mlx serve <folder> --text-only --tool-call-parser qwen3_coder_xml --reasoning-parser qwen3 --speculative-config '{"method":"mtp","model":"<folder>","num_speculative_tokens":3}'
LM Studio: put the folder under your models directory (for example models/leanzero/<folder>); it loads with the MLX engine like any mlx-community model. Measured on this release, see above.
mlx-lm
mlx_lm.generate --model <folder> --prompt "Which Forge module adds a panel to the Jira issue view?"
mlx-lm with the adapter
hf download Mihai-LeanZero/Qwen3.8-27B-Atlassian-lora --local-dir ./atlassian-lora
mlx_lm.generate --model Mihai-LeanZero/Qwen3.8-27B-Atlassian-Q8-base-mlx --adapter-path ./atlassian-lora --prompt "Write the manifest.yml for a Jira issue panel with UI Kit"
Thinking: temperature 1.0, top_p 0.95, top_k 20. Instruct: temperature 0.7, top_p 0.8, top_k 20, presence penalty 1.5. Trained with reasoning_effort=medium, preserve_thinking=false.
It knows far more Atlassian than the base but it is not a compiler: a complete app from a one-line brief can still need one fix before forge deploy. With thinking off the usual one is a TypeScript typing error against @forge/react or @forge/bridge; the next is a resolver or resources key placed under modules, or a handler path that does not match the file. Pair it with the manifest validator and tsc. Use thinking for questions and thinking OFF (enable_thinking: false / --no-thinking) for code generation; measured on round 1, 56% vs 16% manifest validity. Version facts are pinned to the June 2026 @forge/* wave; the weights do not update themselves, and asked cold which major of a Forge package is current it usually declines (13-question post-April slice: 15%, v0.4 38%; every app brief states its package versions, which is where the app numbers come from). English only. Trained with reasoning_effort=medium.
Qwen3.8-27B-Atlassian-Q8-mlx (the model, 8-bit, MTP sidecar), Qwen3.8-27B-Atlassian-lora (the adapter), Qwen3.8-27B-Atlassian-Q6-mlx and Qwen3.8-27B-Atlassian-Q4-mlx (smaller, quantised from the merged bf16 weights), Qwen3.8-27B-Atlassian-Q8-base-mlx (the untouched base). A Qwen3.5-9B version (Qwen3.5-9B-Atlassian-Q8-mlx and family) is trained on the same data and published under the same gates.
Apache-2.0 (inherits the base). Training data: Forge apps written by LeanZero, public Atlassian developer documentation, Atlassian Cloud OpenAPI specifications, LeanZero's vetted community-research compendium and posted community answers, 220 public Atlassian Developer Community threads (question plus accepted answer), and a small general-code replay slice. No credentials; tenant hostnames and e-mail addresses were rewritten before training, and the finished model was probed for memorised strings against a control run on the untrained base. Method and gates: see the LeanZero write-up.