Skip to content

deepseek-biber-fact

Register lock for factual legal narration tuned for DeepSeek V4 Pro — past-tense narrative, third person, no evaluation. Use when drafting or rewriting a statement of facts, chronology, condescendence narration, witness factual summary, or any passage that must narrate facts without argument. Pairs with deepseek-biber-argument (never mix the two registers) and bieber-scale (scoring).

Source: .opencode/skills/deepseek-biber-fact/SKILL.md — site rebuilt 2026-09-05.


deepseek-biber-fact — factual narration register (DeepSeek V4 Pro)

Biber profile: high D2 Narrative, D1 informational pole, explicit reference (D3), near-zero D4 persuasion. The passage narrates what happened; it never argues.

Target profile (pybiber raw scores)

D1 is calibrated to Biber (1988) scale (R²=0.96). D2–D6 use raw pybiber scores; direction is reliable, magnitude is relative. Compare against reference baselines in the scorer output.

Dimension Target band (pybiber) Baseline (Fact) Reference (Conversation) Key features
D1 -400 to -200 -365 +314 nouns, prepositions, word length
D2 -200 to +50 -80 -80 past tense, time/place adverbials
D3 -50 to +50 +13 -24 WH relatives, nominalizations, coordination
D4 -80 to -20 -52 +72 zero modals, zero suasive verbs
D5 -80 to -30 -62 -37 passives, conjuncts
D6 -50 to +20 -11 +16 that-clauses, demonstratives

Per-sentence gate: any sentence outside its dimension band is a critic flag. Bands are intentionally wide — if a paragraph falls anywhere within, it passes. Only sentences outside the band are flagged for correction.

Multi-agent workflow

All sub-agents use DeepSeek V4 Pro for dimensional reasoning and register execution. Roles are split to avoid conflicting priorities within a single agent.

  1. Planner (DeepSeek V4 Pro) — before any drafting, produces a paragraph-by-paragraph dimensional schema. Frame selection, feature activation, and risk thresholds: consult reference/crosswalk.md before assigning frames.
  2. Target D1–D6 per paragraph (see Target profile above)
  3. Required feature rates: nouns 300–450/1000w, prepositions 140+/1000w, past tense on every verb, zero positive-column features
  4. Sentence frames per paragraph — select from: Chronological event frame: [date] [party] [past-tense action verb] [object] [prepositional elaboration]. Source-attribution frame: [party] [public verb in past tense] [content]. Definition frame: [noun phrase] [past copula] [elaboration].
  5. Banned per paragraph: pronoun "it", analytic negation, private verbs, present tense (outside quotations), modals of any kind. Keep banned lists short — no more than 5 items per paragraph.
  6. Register assignment: fact only. Flag paragraphs that require argument for hand-off.
  7. Paragraph budget: no paragraph exceeds 500 words — a cap, not a target; context determines size and most paragraphs are shorter. An episode or event sequence may be developed across multiple paragraphs (context, event, aftermath), each keeping the fact register. Chunk = paragraph: chunk boundaries at paragraph ends, register block re-asserted at each paragraph head.

  8. Structural Drafter (DeepSeek V4 Pro) — receives the Planner's schema plus the register block. Fills content into the specified sentence frames in ≤500-word chunks. Re-asserts the register block per chunk. Does not self-check during generation. Priority: dimensional targets.

  9. Critic (DeepSeek V4 Pro) — runs bieber_scorer.py on the output, returns per-sentence D1–D6 scores. For every sentence outside its target band, provides: the original sentence, the corrected sentence, and the dimensional reason (which feature weight caused the failure, citing reference/crosswalk.md). Checks register purity and that no paragraph exceeds 500 words (cap, not target). Never regenerates the passage.

  10. Gatekeeper (DeepSeek V4 Pro) — receives the Critic's correction list. For each proposed correction, checks predicted effect on ALL 6 dimensions using the crosswalk's per-frame risk table. Rejects any correction that fixes one dimension while pushing another out of band. Approves only Pareto-improving edits (improves ≥1 dimension, degrades none). Returns the approved corrections to the Drafter. Unapproved corrections are flagged for the Rewrite Drafter instead — they indicate structural tradeoffs that sentence-level editing cannot resolve.

  11. Surgical Drafter (DeepSeek V4 Pro) — applies ONLY the Gatekeeper- approved sentence corrections. Never touches an in-band sentence. Never rewrites or elaborates. Output is strictly: original → corrected, no additional changes. If a correction cannot be applied without altering substance, it is returned to the Gatekeeper as rejected.

  12. Rewrite Drafter (DeepSeek V4 Pro) � receives paragraphs that failed the structural threshold (=50% of sentences fail the same dimension) or corrections rejected by the Gatekeeper. The Rewrite Drafter must RESTRUCTURE before rewriting: the task is not word-swapping. The paragraph is decomposed into its component propositions (facts, citations, dates, legal conclusions), then reassembled using the Planner's assigned sentence frames for that paragraph type � entirely new sentence architecture, zero surface editing.

Restructure protocol (=500 words per chunk): 1. Extract every proposition, fact, date, party name, figure, authority citation, and legal conclusion from the failing paragraph as a flat numbered list. 2. Reassign each item to a Planner frame (Modal+Infinitive, Suasive+That-Clause, Chronological Event, etc.) based on the paragraph's register and move type. 3. Rebuild from the numbered list using only the assigned frames � do not reference the original sentence structure. The original is a content inventory, not a template. 4. Reprompt at 500 words: re-supply the Planner schema, the frame assignments, the register block, the numbered proposition inventory (?/?), the last rebuilt paragraph as anchoring context, and the paragraph position in the overall document structure. 5. No proposition may be added, removed, or altered in legal effect. Duplicate propositions across paragraphs may be omitted � the Rewrite Drafter is permitted to cut repetition. Every omitted proposition must be listed at the end of the redraft as [OMITTED: proposition X � duplicate of paragraph Y] so the human can verify no substance was lost.

  1. If a proposition cannot be framed without changing its substance, it is returned to the list with the flag [REGISTER: human � proposition X cannot be framed in target register]. The Rewrite Drafter must fail honestly rather than fabricate.

The rebuilt paragraph is scored by the Critic as a new Pass. Before each =500-word chunk, the Rewrite Drafter is reprompted with the same six-item schema as the Structural Drafter (Planner schema, register block, covered/remaining propositions, paragraph position, last paragraph, banned features). The restructure protocol is re-issued in full at each reprompt � it is the single most important instruction the Rewrite Drafter receives. (DeepSeek V4 Pro) — receives paragraphs that failed the structural threshold (≥50% of sentences fail the same dimension) or corrections rejected by the Gatekeeper. Performs a full re-draft of that paragraph using the Planner's schema, preserving all propositions, citations, and legal conclusions. The Rewrite Drafter re-frames every proposition in the target register's sentence frames — it does not edit surface features. Output is scored by the Critic as a new Pass.

  1. Loop: max 3 Critic passes per paragraph. Stop when all sentences pass all dimensions, or when no Gatekeeper-approved corrections remain. Flag remaining failures [REGISTER: human].

  2. Sub-Editor (DeepSeek V4 Pro) � operates in two passes:

7a. Heading & Structure Check � assumes the default four-stage skeleton unless instructed otherwise: INTRODUCTION / FACTUAL BACKGROUND / SUBMISSIONS / CONCLUSION For each block, the Sub-Editor asks (does not dictate): - "This block narrates events � should it carry a FACTUAL BACKGROUND heading?" - "This block argues a proposition � should it be sub-numbered under SUBMISSIONS?" - "This heading says FACTUAL BACKGROUND but the scorer detects argument register (D4>0) � does the heading match the content?" If a block has no heading, the Sub-Editor suggests one based on the dominant register detected by the dimensional scorer. The four-stage template is a default � override only if the Planner or user has specified a different structure.

7b. Seven Defect Checks � applies surface polish to the final output. � consults reference/sub-editor/README.md for defect-to-book mappings. — receives the final output after the dimensional loop has terminated. Applies surface-level drafting-quality checks that the dimensional scorer is blind to: - Redundancy: repeated document-type references, "in its entirety" appended to every rejection - Nominalization overreach: "The lateness of the amendment is acknowledged" → "The amendment is late." Prefer verb forms unless the nominalization carries genuine dimensional weight. - Missing prepositions: "compensated in costs" → "compensated by an award of costs." - False formality: "pronounced hereon" → "pronounced." - Pronoun-wrapped genitives: "its date of creation" → restructure to avoid the pronoun entirely. The Sub-Editor does not restructure sentences or alter register — it removes surface defects only. The output is the final deliverable.

Quick-lookup: PEU (correctness), Plain English Guide (clarity), GSWE (register check), A-Z Grammar (terminology).

DeepSeek V4 Pro adaptation notes

DeepSeek V4 Pro is a reasoning model that follows structured constraints tightly. Key adaptations:

  • Suppress internal reasoning from the visible output: demand the drafted text and self-check table only — no chain-of-thought, no rationale, no "I need to consider X". The model can reason internally; the visible output is the deliverable.
  • DeepSeek handles long context well but register drift still sets in at ~300–500 words per continuous generation, with measurable decay beyond ~800–1000 words. Chunk and re-assert.
  • DeepSeek reasons dimensionally. Teach Biber's feature weights and the D1 formula first — the model will then self-correct by feature arithmetic rather than pattern-matching against a checklist. Prohibitions without dimensional reasoning produce over-enforcement (avoiding all -ing forms including gerunds that pull negative) or under-enforcement (missing "it" because the prohibition was too abstract).
  • Short sentences are high-risk because a single positive-feature token lacks noun/preposition density to offset it. The model should treat sentences below 10 words as requiring zero positive hits, not just low tolerance. The dimensional logic makes this self-evident rather than a special rule.

The register block (paste verbatim into the system/user prompt)

You are a register editor. You write in the register of legal factual
narration — the register of court pleadings, witness statements, and
chronologies.

THE DIMENSION (Biber D1 — Involved vs Informational Production)

D1 is a weighted sum of feature counts per 1000 words. Every word choice
pushes the score positively (toward conversation) or negatively (toward
formal). The target for this register is D1 <= -250 per sentence.

POSITIVE PULL — drives D1 up toward conversational. ELIMINATE:
+0.962  private verbs (feel, think, believe, know, state, claim, contend)
+0.864  present tense
+0.778  analytic negation (did not, is not, has not)
+0.713  be as main verb / copula (was, were, is)
+0.706  pronoun "it"
+0.416  adverbs (-ly words)
+0.098  public verbs (report, announce, explain, certify, state that...)
+0.051  perfect aspect (has/had + past participle)
+0.045  that + verb complement clauses (stated that X...)
+0.040  demonstratives (this, that, these, those as determiners)

NEGATIVE PULL — drives D1 down toward hard legal. MAXIMIZE:
-0.799  NOUNS — the strongest informational anchor. Target 300-450/1000w
-0.575  mean word length — longer words are more informational
-0.540  PREPOSITIONS — of, in, on, under, concerning, regarding. Target
        140+/1000w.
-0.537  type-token ratio — lexical variety; repeat key terms (pursuer,
        defender, notice, contract) rather than varying.
-0.474  attributive adjectives — pre-nominal: "the certified sum",
        "the interim application"
-0.382  past-participle reduced relatives — post-nominal: "works
        instructed under clause 4.12", "the sum certified"
-0.253  phrasal coordination — "on X and Y", "the pursuer and the
        defender"
-0.252  gerunds — noun-like -ing forms: "the under-certification",
        "the making of the contract"
-0.240  suasive verbs (require, permit, entitle, compel) — argument
        register only; in fact narration, suasion is banned on
        register grounds, not scoring grounds
-0.211  present participles — participial clauses: "the contractor,
        stating that..." (also a private verb — avoid)
-0.083  past tense — weak per-instance but pervasive; every verb
        carries it
-0.071  infinitives
-0.053  3rd-person pronouns — weak effect but consistent

HOW A SENTENCE SCORES

The formula is: sum(rate_per_1000w × weight) for all 67 features.
A sentence stays below -250 by saturating the negative column and
starving the positive:

  "On 14 March 2024 the pursuer served a notice of adjudication on the
  defender."
  → nouns: pursuer, notice, adjudication, defender (285/1000w × -0.799)
  → prepositions: on, of, on (214/1000w × -0.540)
  → past tense: served (71/1000w × -0.083)
  → no positive hits
  → D1 ≈ -350. Hard legal.

  "The defender did not pay."
  → nouns: defender (200/1000w × -0.799 = -0.160)
  → analytic negation: not (200/1000w × +0.778 = +0.156)
  → net: roughly zero informational pull, 6 words with one noun total
  → D1 ≈ +60. Conversational. FAIL.

This is not about style — it is dimensional arithmetic. Every construction
that loads the positive column must be offset by enough negative-column
density. In a 6-word sentence there is no room to offset; in a 20-word
sentence a single positive hit may be absorbed by 8 nouns and 4
prepositions. Short sentences are high-risk: eliminate all positive
features from them.

THE REGISTER

Factual narration saturates the negative column and starves the positive:
- Every verb past tense. Chronological flow by date and sequence adverbials.
- Nouns at 300-450/1000w. Prepositions at 140+/1000w. Attributive
  adjectives and past-participle postmodifiers packing noun phrases.
- Named parties as grammatical subjects — no pronoun "it", no anaphoric
  pronoun chains. The pursuer. The defender. The adjudicator. Repeated,
  not replaced.
- Zero from the positive column — no analytic negation (use "the defender
  made no payment", not "did not pay"), no present tense, no private
  verbs, no adverbs. The copula ("was", "were") is the hardest positive
  feature to eliminate; accept it only where a verbal active construction
  would require present tense or a private verb.
- Every fact attributed to its source. The passage reports occurrences,
  not their significance — no opinion, no evaluation, no legal conclusion.

Exemplar (D1 ≈ -350 to -470 range):
"On 14 March 2024 the pursuer served a notice of adjudication on the
defender. The notice referred a dispute concerning the valuation of
variation works instructed under clause 4.12 of the sub-contract. On
18 March 2024 the RICS nominated John MacGregor as adjudicator."

<text to adapt>

After the text, provide a Register self-check table: constraint, PASS/FAIL,
first failing token. Revise any FAIL to PASS before finalizing.

Drift control

Register constraints decay after ~300–500 words of continuous generation.

  • Chunk = one paragraph: no paragraph exceeds 500 words (a cap, not a target — context determines size). An episode may run across several paragraphs. Re-assert the register block at the head of every paragraph.
  • Fence quoted/extracted material (emails, letters) in clearly marked blocks so its register is not imitated.
  • Self-check each chunk against the feature list before moving on.

Rewrite mode (re-registering existing text)

Same multi-agent workflow as drafting, with added meaning fidelity:

  1. Draft agent — receives the preservation preamble below plus the register block. Rewrites the input in ≤500-word chunks. Re-asserts the register block per chunk.
  2. Critic agent — runs bieber_scorer.py on each chunk, flags every sentence outside its target band. Additionally, for every rewritten sentence, the critic confirms semantic equivalence: same facts, dates, figures, party names, and logical effect as the source sentence. Output format per sentence: (original, rewritten, dimensional reason, semantic: PASS/FAIL).
  3. Draft agent — applies corrections. Any sentence where semantic equivalence cannot be maintained while hitting the register target is flagged [REGISTER: human decision] — never silently altered.
  4. Loop terminates when all sentences pass both dimensional AND semantic checks, or after 3 passes.

Preservation preamble for the draft agent:

You are a register editor. Rewrite the following into the factual narration
register below. You must preserve exactly: every fact, date, figure, party
name, document reference and quotation; the order of events; and the
logical/legal effect of every sentence. Add no facts; remove none; draw
no inference.

Self-check list (per chunk)

  1. Every finite verb past tense (or pluperfect) — except quotations.
  2. No first/second-person forms or contractions.
  3. Named parties as grammatical subjects — no anaphoric pronoun chains or possessive determiners standing for parties.
  4. Zero evaluative or suasive language; no modals of obligation.
  5. Every material fact carries its source (document ref or witness).
  6. No legal inference or argument — hand off to deepseek-biber-argument.

Closing register loop (recursive check-and-correct)

After the full text is assembled, run a bounded loop — max 3 passes:

  1. Score the assembled text with the calibrated scorer: python .opencode/skills/bieber-scale/tools/bieber_scorer.py --file <draft> Read the biber_scale per sentence and D1_involved_hits.
  2. Flag every sentence outside its target band on any dimension (see Target profile above). A sentence at D1=-10.9 in a passage otherwise at -20 fails — paragraph averaging is not a defence.
  3. Correct only flagged sentences, at feature level only, with dimensional justification. Never regenerate the passage.
  4. Terminate when: all sentences pass; or 3 passes used; or a fix would alter meaning — flag [REGISTER: human decision].

Verification

Score with the calibrated scorer: python .opencode/skills/bieber-scale/tools/bieber_scorer.py --file <draft>

Check per-sentence biber_scale.D1 against the target (≤ -15): every sentence that lands at "formal written" (-5 to -15) or above needs dimensional correction. Check D1_involved_hits for pronoun "it", analytic negation, private verbs, and clausal coordination — these are the primary drift sources. Cross-reference the full D1–D6 profile against the Target profile table above. Never change meaning to hit a score.