# core/validators/governance.validator.ts

> 47 lines of code and 8 definitions.

Tree: GovLab Docs
Language: typescript
Layer: processing
Canonical: https://banes-lab.com/anatomy/docs#file-docs-core-validators-governance-validator-ts
Source text: https://banes-lab.com/source/docs/core/validators/governance.validator.ts.txt

Listed in [core/validators](https://banes-lab.com/api/source/docs/core/validators.md), after [core/validators/filename.validator.ts](https://banes-lab.com/source/docs/core/validators/filename.validator.ts.md) and before [core/validators/location.validator.ts](https://banes-lab.com/source/docs/core/validators/location.validator.ts.md).

## Definitions

- `principleFindings` (lexical_declaration, line 16)
- `governPrinciples` (lexical_declaration, line 30, exported)
- `governConcepts` (lexical_declaration, line 41, exported)
- `conflictIds` (lexical_declaration, line 9)
- `ontologyDuplicateFindings` (lexical_declaration, line 37, exported)
- `principles` (lexical_declaration, line 31, exported)
- `declared` (lexical_declaration, line 33, exported)
- `ids` (lexical_declaration, line 45, exported)

## Contained in

- [core/validators](https://banes-lab.com/anatomy/docs/folder-docs-core-validators.md)

## Uses

- [configuration/strings/governance.strings.ts](https://banes-lab.com/source/docs/configuration/strings/governance.strings.ts.md)

## Used by

- [core/factories/document.factory.ts](https://banes-lab.com/source/docs/core/factories/document.factory.ts.md)

## Linked from

- [configuration/strings](https://banes-lab.com/anatomy/docs/folder-docs-configuration-strings.md)
- [core/factories](https://banes-lab.com/anatomy/docs/folder-docs-core-factories.md)
- [core/validators](https://banes-lab.com/anatomy/docs/folder-docs-core-validators.md)

## Source

```typescript
import type { ArchPort, ConceptRecord, Manifest, OntologyFinding } from "#types/readme.types";
import {
    ambiguousPrinciple,
    conflictingPrinciples,
    unresolvedConcept,
    unresolvedPrinciple,
} from "#configuration/strings/governance.strings";

const conflictIds = function conflictIds(id: string, arch: ArchPort, declared: ReadonlySet<string>): string[] {
    return arch
        .resolve([id])
        .edges.conflictsWith.flatMap((edge) => (typeof edge === "string" ? [] : [edge.id]))
        .filter((other) => other !== id && declared.has(other));
};

const principleFindings = function principleFindings(
    id: string,
    arch: ArchPort,
    declared: ReadonlySet<string>,
): OntologyFinding[] {
    if ((arch.get(id) ?? null) === null) {
        return [{ axis: "unresolved-principle", detail: unresolvedPrinciple(id) }];
    }
    return conflictIds(id, arch, declared).map((other) => ({
        axis: "conflicting-principles",
        detail: conflictingPrinciples(id, other),
    }));
};

export const governPrinciples = function governPrinciples(manifest: Manifest, arch: ArchPort): OntologyFinding[] {
    const principles = manifest.governance?.principles;
    const ids = Array.isArray(principles) ? principles : [];
    const declared = new Set(ids);
    return ids.flatMap((id) => principleFindings(id, arch, declared));
};

export const ontologyDuplicateFindings = function ontologyDuplicateFindings(arch: ArchPort): string[] {
    return arch.validateOntology().duplicateIds.map(ambiguousPrinciple);
};

export const governConcepts = function governConcepts(
    manifest: Manifest,
    concepts: ReadonlyMap<string, ConceptRecord>,
): OntologyFinding[] {
    const ids = Array.isArray(manifest.governedBy) ? manifest.governedBy : [];
    if (concepts.size === 0) {
        return [];
    }
    return ids
        .filter((id) => !concepts.has(id))
        .map((id) => ({ axis: "unresolved-concept", detail: unresolvedConcept(id) }));
};
```
