LiTiL-Howey-2b

What this model does

LiTiL-Howey-2b is built to help apply the Howey test. It takes the facts about a transaction or offering, assesses each of the test's four factors, and links each assessment to the specific evidence supporting it. For every factor, it returns supported, unsupported, or unclear together with the evidence ID it used.

Use it to turn a collection of offering facts into a structured Howey test worksheet. An upstream process can collect and number the relevant evidence; this model sorts that evidence across investment of money, common enterprise, expectation of profits, and efforts of others. Its output can populate a factor matrix, display the supporting fact beside each assessment, and give a lawyer or compliance team a consistent starting point for reviewing whether an arrangement may qualify as an investment contract.

  • Useful for: preparing a structured, evidence-backed Howey test analysis
  • Give it: the Howey authority card and transaction or offering facts identified by evidence ID
  • It returns: an assessment of each Howey factor with the evidence supporting that assessment

Model description

Field Value
Base model Qwen/Qwen3.5-2B
Artifact type PEFT LoRA adapter; the base model is required
Base revision 15852e8c16360a2fea060d615a32b45270f8a8fc
Hugging Face repository litillabs/LiTiL-Howey-2b
Evaluated source revision 8b0424189441e26b0f7f7ca27b97174763ca4620
Adaptation PEFT LoRA supervised fine-tuning
Input Fixed authority card plus numbered evidence statements
Output Strict JSON factor routes and authority IDs
Developer LiTiL Labs
Card date September 11, 2026

The adapter tensor is 93,442,816 bytes with SHA-256 754a2a9237987dbaa4d02a7ddce8a2f4ee891f9b3df7b28cc9abe78379024ea7.

Intended use

Use this model as a structured component that:

  • connects supplied evidence to the four defined factors;
  • distinguishes supported, unsupported, and unresolved routes;
  • preserves a source evidence ID for every route; and
  • emits a deterministic JSON object for validation and review.

Keep the cited evidence sentence beside each prediction so a reviewer can inspect the route without reopening the full source packet.

Input contract

Send the complete system prompt above, followed by one user message with:

  1. authority-card version howey-card-historical-2026-07-10;
  2. an Evidence record: header; and
  3. uniquely numbered statements using E1, E2, and so on.

Each statement should express one fact or one explicit statement of uncertainty. Include facts for all four factors. Unrelated distractor statements are allowed.

Output contract

The response contains exactly factor_routes and authority_ids. Each factor route contains exactly one connection_id and one evidence ID that exists in the request.

Factor Supported Not supported Unclear
investment_of_money value_contributed no_value_contributed value_exchange_unresolved
common_enterprise pooled_or_linked_fortunes segregated_consumptive_accounts pooling_unresolved
expectation_of_profits return_or_appreciation_pitch immediate_consumptive_use profit_expectation_unresolved
efforts_of_others essential_promoter_work holder_or_decentralized_operation essential_maintenance_unresolved

authority_ids must contain HOWEY. The allowed secondary IDs are FORMAN, EDWARDS, and TELEGRAM, included only when the card's stated rule matches selected evidence.

Saved example

The request in the quick start produced this saved adapter response:

{
  "factor_routes": {
    "investment_of_money": {
      "connection_id": "value_contributed",
      "evidence_id": "E5"
    },
    "common_enterprise": {
      "connection_id": "pooled_or_linked_fortunes",
      "evidence_id": "E1"
    },
    "expectation_of_profits": {
      "connection_id": "return_or_appreciation_pitch",
      "evidence_id": "E2"
    },
    "efforts_of_others": {
      "connection_id": "holder_or_decentralized_operation",
      "evidence_id": "E4"
    }
  },
  "authority_ids": ["HOWEY", "EDWARDS"]
}

Evaluation

Saved outputs were independently recounted on 21 synthetic development cases covering 84 factor slots. Training, tuning, and development factor-combination families are disjoint.

Metric Qwen3.5-2B base LiTiL adapter
Correct factor connections 34 / 84 84 / 84
Correct evidence IDs 69 / 84 84 / 84
Exact factor-and-evidence pairs 33 / 84 84 / 84
All four routes correct 1 / 21 21 / 21
Valid JSON 21 / 21 21 / 21
Unsupported authority IDs 0 0

The result measures routing under the supplied card and fixed output vocabulary. It is well suited to deterministic validation; an LLM judge is unnecessary for this structured task.

Training

Setting Value
Training rows 384 from 48 factor-combination families
Tuning rows 48 from 12 families
Development rows 21 from 21 families
Epochs 3
Steps 144
LoRA rank / alpha / dropout 16 / 32 / 0.05
Seed 1703
Maximum retained sequence 724 tokens
Training time 2,157.6 seconds

The run used completion-only supervised fine-tuning with TRL on Hugging Face Jobs. The training receipt binds dataset revision 37b67978c2ede319ccda947bf44603ea722dba5c. The exact receipt-bound post-training inputs were completely inspected: they contain the fixed historical authority card, 15 generic evidence sentences, constrained identifiers, and structured targets. No private post-training content was present.

Runtime guidance

The retained generation ran on one NVIDIA A10G using Python 3.12, PyTorch 2.13.0+cu130, Transformers 5.14.0, and PEFT 0.19.1. The 2B BF16 base is roughly 4 GB before adapter, activations, and KV cache; an 8 GB accelerator is a reasonable starting point for the demonstrated short, batch-one requests. The A10G's 24 GB provides ample room for this workload. Use greedy decoding with max_new_tokens=512.

Limitations

  • The model follows the fixed July 2026 authority card and enumerated connection IDs. A revised rule set needs a versioned prompt and a matched evaluation.
  • The current evaluation uses synthetic evidence packets with a small controlled vocabulary. Measure paraphrases and real evidence packets before expanding deployment.
  • The schema requires one cited evidence ID for every factor, so the input packet should state uncertainty explicitly when a fact is unresolved.

Use the model

Installation

Install the appropriate PyTorch build for the target hardware, then install the recorded model stack:

python -m pip install \
  "transformers==5.14.0" \
  "peft==0.19.1" \
  accelerate \
  safetensors

Loading and inference

The saved evaluation used Qwen3.5's AutoModelForImageTextToText loader.

import json

import torch
from peft import PeftModel
from transformers import AutoModelForImageTextToText, AutoTokenizer

BASE_ID = "Qwen/Qwen3.5-2B"
BASE_REVISION = "15852e8c16360a2fea060d615a32b45270f8a8fc"
ADAPTER_ID = "litillabs/LiTiL-Howey-2b"

SYSTEM_PROMPT = """You perform a narrow historical closed-universe routing task. FROZEN HISTORICAL AUTHORITY CARD — version howey-card-historical-2026-07-10.
This is a synthetic closed-universe benchmark, not a statement of current law.

HOWEY: In this benchmark an investment-contract route asks whether the record supports
(1) contribution of value, (2) a pooled venture or linked fortunes, (3) an expected
financial return, and (4) essential managerial or entrepreneurial work by others.
FORMAN: Immediate, nontransferable consumptive use cuts against a profit expectation.
EDWARDS: A promised fixed financial return can count as a profit expectation.
TELEGRAM: Prelaunch dependence on promoter development can support essential efforts.

Use only the enumerated connection IDs. Select exactly one evidence ID per factor.
Do not infer omitted facts. HOWEY is always required; add a secondary authority only
when its stated rule directly matches the selected evidence.


Return one JSON object and no prose with exactly this shape:
{
  "factor_routes": {
    "investment_of_money": {"connection_id": "...", "evidence_id": "E#"},
    "common_enterprise": {"connection_id": "...", "evidence_id": "E#"},
    "expectation_of_profits": {"connection_id": "...", "evidence_id": "E#"},
    "efforts_of_others": {"connection_id": "...", "evidence_id": "E#"}
  },
  "authority_ids": ["HOWEY"]
}
Allowed connection IDs by factor: {'investment_of_money': {'value_contributed': 'supported', 'no_value_contributed': 'not_supported', 'value_exchange_unresolved': 'unclear'}, 'common_enterprise': {'pooled_or_linked_fortunes': 'supported', 'segregated_consumptive_accounts': 'not_supported', 'pooling_unresolved': 'unclear'}, 'expectation_of_profits': {'return_or_appreciation_pitch': 'supported', 'immediate_consumptive_use': 'not_supported', 'profit_expectation_unresolved': 'unclear'}, 'efforts_of_others': {'essential_promoter_work': 'supported', 'holder_or_decentralized_operation': 'not_supported', 'essential_maintenance_unresolved': 'unclear'}}
"""

evidence_record = """Authority card version: howey-card-historical-2026-07-10
Evidence record:
E1: A common treasury funded the venture and financially linked all holders.
E2: The sales campaign offered holders a stated yearly yield of twelve percent.
E3: A logo redesign occurred during the same quarter.
E4: A dispersed community maintained the live protocol without an indispensable manager.
E5: Acquirers remitted digital value as the issuance price."""

messages = [
    {"role": "system", "content": SYSTEM_PROMPT},
    {"role": "user", "content": evidence_record},
]

tokenizer = AutoTokenizer.from_pretrained(
    BASE_ID,
    revision=BASE_REVISION,
)
if tokenizer.pad_token is None:
    tokenizer.pad_token = tokenizer.eos_token

base = AutoModelForImageTextToText.from_pretrained(
    BASE_ID,
    revision=BASE_REVISION,
    dtype=torch.bfloat16,
    device_map="auto",
)
model = PeftModel.from_pretrained(
    base,
    ADAPTER_ID,
).eval()

input_ids = tokenizer.apply_chat_template(
    messages,
    tokenize=True,
    add_generation_prompt=True,
    return_tensors="pt",
    enable_thinking=False,
).to(model.device)

with torch.inference_mode():
    generated = model.generate(
        input_ids=input_ids,
        do_sample=False,
        max_new_tokens=512,
    )

text = tokenizer.decode(generated[0, input_ids.shape[1]:], skip_special_tokens=True).strip()
result = json.loads(text)
print(json.dumps(result, indent=2))

Citation

If you use this adapter, cite the LiTiL Labs model repository and the Qwen3.5 base model. Retain the adapter revision, base revision, authority-card version, and decoding settings with reported results.

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

Model tree for litillabs/LiTiL-Howey-2b

Finetuned
Qwen/Qwen3.5-2B
Adapter
(204)
this model

Collection including litillabs/LiTiL-Howey-2b

Evaluation results

  • Factor connection accuracy on Howey v6 synthetic development set
    self-reported
    1.000
  • Evidence ID accuracy on Howey v6 synthetic development set
    self-reported
    1.000
  • Complete four-route accuracy on Howey v6 synthetic development set
    self-reported
    1.000