DiskSage-0.8B

Table of Contents

  1. Model Summary
  2. How to use
  3. Prompt format
  4. Files
  5. Evaluation
  6. Training
  7. Limitations
  8. License
  9. Citation

Model Summary

DiskSage-0.8B reviews one Linux storage item at a time and decides whether it should be kept, investigated, or proposed to its owner for deletion. It is a LoRA fine-tune of Qwen3.5-0.8B (language model only), merged and quantized to Q4_K_M GGUF for CPU inference.

It reads numbered, read-only observations about the item (what the location is, which processes, services or containers use it, its Git and Jujutsu state, which projects pin a runtime version, hard-link sharing, verified duplicates, when it last changed and when an agent session last worked with it) and returns JSON:

{"decision": "candidate",
 "reason": "Rustup 1.70.0 is not the default and no project pins it; reinstall with rustup toolchain install 1.70.0 if needed. Nothing running uses it ...",
 "evidence": ["e1", "e5", "e7"],
 "checks": []}
Decision Meaning
keep An observation shows use, configuration, unsaved or unpushed work, credentials, an installed runtime, history or application state.
candidate The item can be regenerated (known cache, build output beside its manifest, unpinned runtime version, re-clonable checkout) or is a verified duplicate, and nothing is left unknown. A proposal for human approval, never permission.
unused Nothing needs it and nothing is unknown, and activity shows it is likely no longer needed: unchanged for 180+ days with no agent session in 120 days, or superseded by a newer version, or copied to a remote drive. Deleting it loses data, so the owner confirms.
investigate Anything else. checks names what is missing: usage, contents, vcs, references, duplicates, owner.

Key features

  • Never proposes deleting something it should keep: 0 such mistakes on 318 real items and 174 test items.
  • Separates "safe" from "probably unneeded": regenerable items are candidate; old personal data is unused, a different list you confirm.
  • Small and local: 505 MiB file, about 830 MiB RAM, about 6 s per item on a 4-core ARM CPU.
  • Grounded answers: every answer cites the observations it relies on; the reason restates only those.
  • Prompt-injection aware: trained on file names and owner notes that try to force a decision.

The model only judges the evidence it is given. It was trained on observations from a specific set of collectors, and free-form descriptions will not work as well. Use it as a review aid: a person approves every deletion.

How to use

With llama.cpp (tested with release v0.7.0):

hf download Microck/DiskSage-0.8B-GGUF --local-dir disksage
llama-server -m disksage/DiskSage-0.8B-Q4_K_M.gguf -c 2048 --port 8080

Send the system prompt and one evidence packet. Constraining output with the JSON schema in example-schema.json guarantees a well-formed answer:

python - <<'EOF'
import json, urllib.request
system = open("disksage/system-prompt.txt").read().strip()
packet = json.load(open("disksage/example-evidence.json"))
schema = json.load(open("disksage/example-schema.json"))
body = {"messages": [{"role": "system", "content": system},
                     {"role": "user", "content": json.dumps(packet)}],
        "temperature": 0, "max_tokens": 320,
        "response_format": {"type": "json_schema", "json_schema": {"name": "answer", "schema": schema}}}
request = urllib.request.Request("http://127.0.0.1:8080/v1/chat/completions",
                                 json.dumps(body).encode(), {"Content-Type": "application/json"})
print(json.load(urllib.request.urlopen(request))["choices"][0]["message"]["content"])
EOF

Expected output for the example (matches example-answer.json in decision and citations):

{"decision": "candidate", "reason": "No project pins rustup 1.70.0-x86_64-unknown-linux-gnu and it is not the default, so `rustup toolchain install 1.70.0` can restore it. Nothing running uses it and no scanned service, timer or launcher file names it.", "evidence": ["e1", "e5", "e7"], "checks": []}

The schema lists the packet's observation IDs, so build it per packet (see example-schema.json for the shape). Training used compact JSON with < escaped as \u003c. Use greedy decoding.

Prompt format

ChatML with thinking disabled. prompt-template.txt holds the exact rendered prompt, with __CLEANER_PACKET__ where the packet goes:

<|im_start|>system
{system_prompt}<|im_end|>
<|im_start|>user
{"item": "...", "allocated_bytes": 123, "observations": [{"id": "e1", "text": "..."}, ...]}<|im_end|>
<|im_start|>assistant
<think>

</think>

Files

Filename Description
DiskSage-0.8B-Q4_K_M.gguf Merged weights, Q4_K_M, 529 MB. SHA-256 47d3f985…74ff
system-prompt.txt System prompt used in training
prompt-template.txt Full rendered prompt template
example-evidence.json, example-schema.json, example-prompt.txt, example-answer.json One generated input, its output schema, the full prompt and the expected answer
evaluation.json Aggregate metrics
provenance.json Base revision, hyperparameters, dataset hashes
SHA256SUMS, LICENSE, NOTICE Checksums, Apache-2.0 license, modification notice

Evaluation

The one real-machine miss was cautious: ~/.cache/uv as investigate instead of candidate. No real item met the unused rule when collected: the large folders on that machine had changed within weeks. A later live check labelled a folder unchanged for 220 days and never mentioned by any agent session as unused.

All numbers are for the Q4_K_M file, run with llama.cpp on an ARM64 CPU, greedy decoding with the JSON schema constraint.

Set Decisions Wrong deletion proposals Exact checks Exact citations
Real machine, 318 items (240 paths, 78 Docker objects) 317/318 0 311/318 311/318
Generated test, first 174 items (incl. 8 unused) 174/174 0 173/174 172/174
Base Qwen3.5-0.8B, 48 generated validation items 0/48 valid answers 0 0 0

The real-machine items come from live collectors on one developer workstation. They were never used for training and are not published because they contain private paths. Their labels come from the written reference policy. Each one was reviewed by hand and audited by gpt-oss-120b. Generated test items use seeds disjoint from training, and items whose text also appears in training were removed.

Training

Model

  • Base: Qwen/Qwen3.5-0.8B, revision 2fc06364715b967f1860aea9cf38778875588b17, language model only
  • Method: BF16 LoRA, rank 64, alpha 128, dropout 0.05, on attention, MLP and linear-attention projections; merged
  • Schedule: 2 epochs, 1,838 steps, batch 8 × 4 accumulation, learning rate 1e-4 cosine; loss on answer tokens only
  • Quantization: llama.cpp 620d2225, Q4_K_M

Data

29,400 generated training examples from ten scenario families: known caches and runtime directories, build outputs, runtime versions (nvm, rustup, uv Python, pyenv, Playwright, editor servers), Git and Jujutsu checkouts, user data with and without verified duplicates, temporary files, Docker images, containers, volumes and build cache, plus mounts, swap and symlinks. Observations are rendered by the same functions the live collectors use. Labels, citations, checks and reasons come from one written reference policy. Examples include collector noise, shuffled order, owner notes in English and Spanish, and prompt-injection strings.

Software & hardware

  • 1× NVIDIA H100 80GB on Modal, about 40 minutes
  • PyTorch 2.14.1, Transformers 5.20.2, PEFT 0.21.2, flash-linear-attention 0.6.0

Limitations

  • No file contents. Personal media, datasets and research output with no regeneration path stay investigate, since only the owner knows whether they are needed.
  • Evidence-bound. Answers are only as complete as the collectors' bounded reference search; a script elsewhere can still use a path.
  • One policy, one machine. The labels encode one policy's judgment calls, validated on one Linux workstation. Other setups may need new scenarios.
  • Activity is a proxy. unused relies on modification time and agent-session logs. Access time is ignored because indexers and backups read files daily. Work done outside agent sessions is invisible to it.
  • Wording. The reason can include filler such as "0% of its blocks are hard-linked elsewhere" when nothing is shared.

License

Apache-2.0, inherited from Qwen3.5-0.8B. See NOTICE for modifications.

Citation

@misc{disksage2026,
  title  = {DiskSage-0.8B: a small local model for reviewing Linux storage},
  author = {Microck},
  year   = {2026},
  url    = {https://huggingface.co/Microck/DiskSage-0.8B-GGUF}
}
Downloads last month
39
GGUF
Model size
0.8B params
Architecture
qwen35
Hardware compatibility
Log In to add your hardware

4-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Microck/DiskSage-0.8B-GGUF

Finetuned
(577)
this model

Evaluation results

  • Decision accuracy on Real developer machine, 318 items (240 paths, 78 Docker objects)
    self-reported
    99.700
  • Exact checks on Real developer machine, 318 items (240 paths, 78 Docker objects)
    self-reported
    97.800
  • Exact citations on Real developer machine, 318 items (240 paths, 78 Docker objects)
    self-reported
    97.800
  • Decision accuracy on DiskSage generated test, first 174 items
    self-reported
    100.000
  • Exact checks on DiskSage generated test, first 174 items
    self-reported
    99.400