# types/writing.types.ts

> 90 lines of code and 17 definitions.

Tree: Governance tree
Language: typescript
Layer: infrastructure
Canonical: https://banes-lab.com/anatomy/governance#file-governance-types-writing-types-ts
Source text: https://banes-lab.com/source/governance/types/writing.types.ts.txt

Listed in [types](https://banes-lab.com/api/source/governance/types.md), after [types/taxonomy.types.ts](https://banes-lab.com/source/governance/types/taxonomy.types.ts.md).

## Definitions

- `CanonLayerId` (type_alias_declaration, line 1, exported)
- `CanonExample` (interface_declaration, line 3, exported)
- `CanonCheckId` (type_alias_declaration, line 9, exported)
- `CanonDetection` (type_alias_declaration, line 28, exported)
- `CanonCheck` (interface_declaration, line 30, exported)
- `CanonRule` (interface_declaration, line 36, exported)
- `CanonHome` (interface_declaration, line 47, exported)
- `CanonLayer` (interface_declaration, line 52, exported)
- `CompositionKind` (type_alias_declaration, line 61, exported)
- `CompositionFinding` (interface_declaration, line 63, exported)
- `DocumentFinding` (interface_declaration, line 69, exported)
- `DocumentText` (interface_declaration, line 75, exported)
- `TermRecord` (interface_declaration, line 80, exported)
- `RenameRules` (interface_declaration, line 86, exported)
- `RenamedSpan` (interface_declaration, line 93, exported)
- `FieldMood` (type_alias_declaration, line 100, exported)
- `SentenceShape` (interface_declaration, line 102, exported)

## Source

```typescript
export type CanonLayerId = "document" | "identifier" | "note" | "output" | "prose" | "root" | "short";

export interface CanonExample {
    readonly rejected: string;
    readonly repaired: string | null;
    readonly why: string;
}

export type CanonCheckId =
    | "concrete-before-name"
    | "field-mood"
    | "named-agent"
    | "named-party"
    | "no-comment-on-previous"
    | "no-field-restatement"
    | "no-filler-phrase"
    | "no-implied-fact"
    | "no-long-dash"
    | "no-praise-vocabulary"
    | "no-restatement"
    | "no-semicolon"
    | "no-unmeasured-numbers"
    | "one-instruction-per-sentence"
    | "one-new-concept-per-step"
    | "one-term-per-concept"
    | "sentence-cap";

export type CanonDetection = "check" | "review";

export interface CanonCheck {
    readonly detection: CanonDetection;
    readonly enforcedIn: readonly CanonLayerId[];
    readonly id: CanonCheckId;
}

export interface CanonRule {
    readonly bans: readonly string[];
    readonly checks: readonly CanonCheck[];
    readonly conditions: readonly string[];
    readonly examples: readonly CanonExample[];
    readonly gate: string | null;
    readonly id: string;
    readonly rule: string;
    readonly why: string;
}

export interface CanonHome {
    readonly covers: string;
    readonly path: string;
}

export interface CanonLayer {
    readonly covers: readonly string[];
    readonly defersTo: readonly CanonHome[];
    readonly id: CanonLayerId;
    readonly intro: string;
    readonly rules: readonly CanonRule[];
    readonly title: string;
}

export type CompositionKind = "comment" | "filler" | "party" | "restatement";

export interface CompositionFinding {
    readonly evidence: string;
    readonly kind: CompositionKind;
    readonly sentence: string;
}

export interface DocumentFinding {
    readonly check: CanonCheckId;
    readonly evidence: string;
    readonly sentence: string;
}

export interface DocumentText {
    readonly at: string;
    readonly text: string;
}

export interface TermRecord {
    readonly canonical: string;
    readonly concept: string;
    readonly synonyms: readonly string[];
}

export interface RenameRules {
    readonly ids: ReadonlyMap<string, string>;
    readonly pathSegments: readonly string[];
    readonly wholeId: boolean;
    readonly words: ReadonlyMap<string, string> | null;
}

export interface RenamedSpan {
    readonly end: number;
    readonly from: string;
    readonly start: number;
    readonly to: string;
}

export type FieldMood = "declarative" | "imperative";

export interface SentenceShape {
    readonly agentlessPassive: boolean;
    readonly joins: number;
    readonly words: number;
}
```
