# core/validators/tension.validator.ts

> 29 lines of code and 5 definitions.

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

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

## Definitions

- `tensionIssuesOf` (lexical_declaration, line 27, exported)
- `tensionScopeGaps` (lexical_declaration, line 15)
- `tensionEdgeGaps` (lexical_declaration, line 5)
- `deadSeedsOf` (lexical_declaration, line 31, exported)
- `layerNodeIds` (lexical_declaration, line 16)

## Contained in

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

## Uses

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

## Used by

- [core/validators/ontology.validator.ts](https://banes-lab.com/source/context/core/validators/ontology.validator.ts.md)

## Linked from

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

## Source

```typescript
import { DEAD_SEED, TENSION_WITHOUT_LAYER, scopeNotLayer } from "#configuration/strings/validation.strings";
import type { LayerJoin, TensionGap } from "#types/layer.types";
import type { Faces } from "#types/context.types";

const tensionEdgeGaps = function tensionEdgeGaps(faces: Faces): TensionGap[] {
    return faces.arch
        .all()
        .flatMap((principle) =>
            principle.tensions_with
                .filter((target) => !faces.layerJoin.resolveTension(principle.id, target))
                .map((target) => ({ from: principle.id, reason: TENSION_WITHOUT_LAYER, target })),
        );
};

const tensionScopeGaps = function tensionScopeGaps(faces: Faces): TensionGap[] {
    const layerNodeIds = new Set(faces.layerJoin.layers().map((layer) => layer.id));
    return faces.layerJoin
        .resolutions()
        .filter((resolution) => !layerNodeIds.has(resolution.scopeA) || !layerNodeIds.has(resolution.scopeB))
        .map((resolution) => ({
            from: resolution.a,
            reason: scopeNotLayer(resolution.scopeA, resolution.scopeB),
            target: resolution.b,
        }));
};

export const tensionIssuesOf = function tensionIssuesOf(faces: Faces): TensionGap[] {
    return [...tensionEdgeGaps(faces), ...tensionScopeGaps(faces)];
};

export const deadSeedsOf = function deadSeedsOf(layerJoin: LayerJoin): TensionGap[] {
    return layerJoin.deadSeeds().map((seed) => ({ from: seed.a, reason: DEAD_SEED, target: seed.b }));
};
```
