@inventarch/compliance 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +4 -0
- package/README.md +8 -2
- package/SPEC.md +128 -0
- package/dist/adoption.d.ts +18 -0
- package/dist/adoption.d.ts.map +1 -0
- package/dist/adoption.js +76 -0
- package/dist/adoption.js.map +1 -0
- package/dist/catalog.d.ts +112 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +265 -0
- package/dist/catalog.js.map +1 -0
- package/dist/check-ids.d.ts +4 -0
- package/dist/check-ids.d.ts.map +1 -0
- package/dist/check-ids.js +22 -0
- package/dist/check-ids.js.map +1 -0
- package/dist/evidence.d.ts +145 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +468 -0
- package/dist/evidence.js.map +1 -0
- package/dist/fixtures.d.ts +29 -0
- package/dist/fixtures.d.ts.map +1 -0
- package/dist/fixtures.js +107 -0
- package/dist/fixtures.js.map +1 -0
- package/dist/graph-checks.d.ts +27 -0
- package/dist/graph-checks.d.ts.map +1 -0
- package/dist/graph-checks.js +184 -0
- package/dist/graph-checks.js.map +1 -0
- package/dist/host-plugin.d.ts +23 -0
- package/dist/host-plugin.d.ts.map +1 -0
- package/dist/host-plugin.js +204 -0
- package/dist/host-plugin.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/obligations.d.ts +157 -0
- package/dist/obligations.d.ts.map +1 -0
- package/dist/obligations.js +301 -0
- package/dist/obligations.js.map +1 -0
- package/dist/profiles.d.ts +27 -0
- package/dist/profiles.d.ts.map +1 -0
- package/dist/profiles.js +40 -0
- package/dist/profiles.js.map +1 -0
- package/dist/projections.d.ts +51 -0
- package/dist/projections.d.ts.map +1 -0
- package/dist/projections.js +124 -0
- package/dist/projections.js.map +1 -0
- package/dist/record-text.d.ts +26 -0
- package/dist/record-text.d.ts.map +1 -0
- package/dist/record-text.js +73 -0
- package/dist/record-text.js.map +1 -0
- package/dist/report.d.ts +25 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +80 -0
- package/dist/report.js.map +1 -0
- package/dist/schema.d.ts +23 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +229 -0
- package/dist/schema.js.map +1 -0
- package/dist/shape.d.ts +18 -0
- package/dist/shape.d.ts.map +1 -0
- package/dist/shape.js +106 -0
- package/dist/shape.js.map +1 -0
- package/dist/steward-profile.d.ts +39 -0
- package/dist/steward-profile.d.ts.map +1 -0
- package/dist/steward-profile.js +143 -0
- package/dist/steward-profile.js.map +1 -0
- package/dist/systems.d.ts +11 -0
- package/dist/systems.d.ts.map +1 -0
- package/dist/systems.js +86 -0
- package/dist/systems.js.map +1 -0
- package/dist/types.d.ts +23 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +92 -0
- package/dist/types.js.map +1 -0
- package/dist/values.d.ts +8 -0
- package/dist/values.d.ts.map +1 -0
- package/dist/values.js +47 -0
- package/dist/values.js.map +1 -0
- package/dist/variants.d.ts +4 -0
- package/dist/variants.d.ts.map +1 -0
- package/dist/variants.js +82 -0
- package/dist/variants.js.map +1 -0
- package/dist/workspace-projection.d.ts +22 -0
- package/dist/workspace-projection.d.ts.map +1 -0
- package/dist/workspace-projection.js +68 -0
- package/dist/workspace-projection.js.map +1 -0
- package/fixtures/language/cases/fail/duplicate-given.diagnostics.json +10 -0
- package/fixtures/language/cases/fail/duplicate-given.ia +72 -0
- package/fixtures/language/cases/fail/given-scalar.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/given-scalar.ia +71 -0
- package/fixtures/language/cases/fail/head-verdict.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/head-verdict.ia +72 -0
- package/fixtures/language/cases/fail/missing-evaluator.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/missing-evaluator.ia +70 -0
- package/fixtures/language/cases/fail/missing-expected.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/missing-expected.ia +70 -0
- package/fixtures/language/cases/fail/missing-given.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/missing-given.ia +70 -0
- package/fixtures/language/cases/fail/missing-kind.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/missing-kind.ia +70 -0
- package/fixtures/language/cases/fail/missing-request.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/missing-request.ia +70 -0
- package/fixtures/language/cases/fail/scenario-conditioned-field.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/scenario-conditioned-field.ia +71 -0
- package/fixtures/language/cases/fail/scenario-verdict.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/scenario-verdict.ia +72 -0
- package/fixtures/language/cases/fail/unbound.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/unbound.ia +71 -0
- package/fixtures/language/cases/fail/unknown-kind.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/unknown-kind.ia +71 -0
- package/fixtures/language/cases/fail/verdict-block.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/verdict-block.ia +73 -0
- package/fixtures/language/cases/fail/wrong-fragment.diagnostics.json +6 -0
- package/fixtures/language/cases/fail/wrong-fragment.ia +71 -0
- package/fixtures/language/cases/pass/all-scenario-kinds.ia +107 -0
- package/fixtures/language/cases/pass/all-scenario-kinds.records.json +1558 -0
- package/fixtures/language/cells/fail/duplicate-phase-sections.diagnostics.json +10 -0
- package/fixtures/language/cells/fail/duplicate-phase-sections.ia +64 -0
- package/fixtures/language/cells/fail/duplicate-primary.diagnostics.json +10 -0
- package/fixtures/language/cells/fail/duplicate-primary.ia +63 -0
- package/fixtures/language/cells/fail/duplicate-primitive.diagnostics.json +10 -0
- package/fixtures/language/cells/fail/duplicate-primitive.ia +63 -0
- package/fixtures/language/cells/fail/legacy-primary-move.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/legacy-primary-move.ia +61 -0
- package/fixtures/language/cells/fail/means-list.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/means-list.ia +61 -0
- package/fixtures/language/cells/fail/means-reference.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/means-reference.ia +61 -0
- package/fixtures/language/cells/fail/means-scalar.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/means-scalar.ia +61 -0
- package/fixtures/language/cells/fail/means-unsupported-child.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/means-unsupported-child.ia +62 -0
- package/fixtures/language/cells/fail/phase-unknown.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/phase-unknown.ia +61 -0
- package/fixtures/language/cells/fail/primary-quoted.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/primary-quoted.ia +61 -0
- package/fixtures/language/cells/fail/primary-requires-means.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/primary-requires-means.ia +61 -0
- package/fixtures/language/cells/fail/primary-unknown.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/primary-unknown.ia +61 -0
- package/fixtures/language/cells/fail/primitive-case.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/primitive-case.ia +61 -0
- package/fixtures/language/cells/fail/primitive-unknown.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/primitive-unknown.ia +61 -0
- package/fixtures/language/cells/fail/unsupported-item.diagnostics.json +6 -0
- package/fixtures/language/cells/fail/unsupported-item.ia +61 -0
- package/fixtures/language/cells/pass/full-opal-grid.ia +92 -0
- package/fixtures/language/cells/pass/full-opal-grid.records.json +1450 -0
- package/fixtures/language/compile/fail/blocked-keyword.diagnostics.json +1 -0
- package/fixtures/language/compile/fail/blocked-keyword.ia +22 -0
- package/fixtures/language/compile/fail/discriminator-unregistered.diagnostics.json +1 -0
- package/fixtures/language/compile/fail/discriminator-unregistered.ia +19 -0
- package/fixtures/language/compile/pass/minimal-floor.ia +22 -0
- package/fixtures/language/compile/pass/minimal-floor.records.json +293 -0
- package/fixtures/language/compile/pass/nested-and-items.ia +27 -0
- package/fixtures/language/compile/pass/nested-and-items.records.json +373 -0
- package/fixtures/language/conditions/fail/conflicting-name.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/conflicting-name.ia +60 -0
- package/fixtures/language/conditions/fail/dangling-and.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/dangling-and.ia +60 -0
- package/fixtures/language/conditions/fail/empty-child.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/empty-child.ia +61 -0
- package/fixtures/language/conditions/fail/misplaced-head.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/misplaced-head.ia +59 -0
- package/fixtures/language/conditions/fail/misplaced-meaning.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/misplaced-meaning.ia +60 -0
- package/fixtures/language/conditions/fail/misplaced-ordinary-deep.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/misplaced-ordinary-deep.ia +61 -0
- package/fixtures/language/conditions/fail/misplaced-phase.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/misplaced-phase.ia +61 -0
- package/fixtures/language/conditions/fail/misplaced-primary.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/misplaced-primary.ia +62 -0
- package/fixtures/language/conditions/fail/misplaced-severity.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/misplaced-severity.ia +60 -0
- package/fixtures/language/conditions/fail/misplaced-standalone.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/misplaced-standalone.ia +60 -0
- package/fixtures/language/conditions/fail/missing-is.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/missing-is.ia +60 -0
- package/fixtures/language/conditions/fail/mixed-carriers.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/mixed-carriers.ia +61 -0
- package/fixtures/language/conditions/fail/quoted-value.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/quoted-value.ia +60 -0
- package/fixtures/language/conditions/fail/repeated-child.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/repeated-child.ia +62 -0
- package/fixtures/language/conditions/fail/repeated-name.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/repeated-name.ia +60 -0
- package/fixtures/language/conditions/fail/schema-when-block.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/schema-when-block.ia +64 -0
- package/fixtures/language/conditions/fail/unknown-term.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/unknown-term.ia +60 -0
- package/fixtures/language/conditions/fail/unknown-value.diagnostics.json +6 -0
- package/fixtures/language/conditions/fail/unknown-value.ia +60 -0
- package/fixtures/language/conditions/pass/all-carriers-and-dimensions.ia +71 -0
- package/fixtures/language/conditions/pass/all-carriers-and-dimensions.records.json +1131 -0
- package/fixtures/language/contracts/fail/duplicate-requirement-records.diagnostics.json +10 -0
- package/fixtures/language/contracts/fail/duplicate-requirement-records.ia +67 -0
- package/fixtures/language/contracts/fail/duplicate-requirement-sections.diagnostics.json +10 -0
- package/fixtures/language/contracts/fail/duplicate-requirement-sections.ia +64 -0
- package/fixtures/language/contracts/fail/extra-word.diagnostics.json +6 -0
- package/fixtures/language/contracts/fail/extra-word.ia +62 -0
- package/fixtures/language/contracts/fail/id-case.diagnostics.json +6 -0
- package/fixtures/language/contracts/fail/id-case.ia +62 -0
- package/fixtures/language/contracts/fail/id-empty.diagnostics.json +6 -0
- package/fixtures/language/contracts/fail/id-empty.ia +62 -0
- package/fixtures/language/contracts/fail/retired-binds.diagnostics.json +6 -0
- package/fixtures/language/contracts/fail/retired-binds.ia +59 -0
- package/fixtures/language/contracts/fail/retired-schema.diagnostics.json +6 -0
- package/fixtures/language/contracts/fail/retired-schema.ia +62 -0
- package/fixtures/language/contracts/fail/text-reference.diagnostics.json +6 -0
- package/fixtures/language/contracts/fail/text-reference.ia +62 -0
- package/fixtures/language/contracts/fail/text-scalar.diagnostics.json +6 -0
- package/fixtures/language/contracts/fail/text-scalar.ia +62 -0
- package/fixtures/language/contracts/fail/unbound.diagnostics.json +6 -0
- package/fixtures/language/contracts/fail/unbound.ia +60 -0
- package/fixtures/language/contracts/fail/unsupported-child.diagnostics.json +6 -0
- package/fixtures/language/contracts/fail/unsupported-child.ia +63 -0
- package/fixtures/language/contracts/pass/all-requirement-kinds.ia +76 -0
- package/fixtures/language/contracts/pass/all-requirement-kinds.records.json +1101 -0
- package/fixtures/language/edges/fail/identity-fragment.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/identity-fragment.ia +60 -0
- package/fixtures/language/edges/fail/identity-kind.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/identity-kind.ia +60 -0
- package/fixtures/language/edges/fail/identity-short.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/identity-short.ia +60 -0
- package/fixtures/language/edges/fail/missing-target.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/missing-target.ia +60 -0
- package/fixtures/language/edges/fail/source-side-unconsented.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/source-side-unconsented.ia +60 -0
- package/fixtures/language/edges/fail/target-absent.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/target-absent.ia +60 -0
- package/fixtures/language/edges/fail/target-ambiguous.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/target-ambiguous.ia +60 -0
- package/fixtures/language/edges/fail/target-ambiguous.pool.json +26 -0
- package/fixtures/language/edges/fail/target-bare.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/target-bare.ia +60 -0
- package/fixtures/language/edges/fail/target-list.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/target-list.ia +60 -0
- package/fixtures/language/edges/fail/target-quoted.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/target-quoted.ia +60 -0
- package/fixtures/language/edges/fail/target-side-unconsented.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/target-side-unconsented.ia +60 -0
- package/fixtures/language/edges/fail/target-trailing-word.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/target-trailing-word.ia +60 -0
- package/fixtures/language/edges/fail/unknown-verb.diagnostics.json +6 -0
- package/fixtures/language/edges/fail/unknown-verb.ia +60 -0
- package/fixtures/language/edges/pass/all-verbs-and-addresses.ia +114 -0
- package/fixtures/language/edges/pass/all-verbs-and-addresses.records.json +2221 -0
- package/fixtures/language/format/fail/lost-comment.candidate.txt +5 -0
- package/fixtures/language/format/fail/lost-comment.diagnostics.json +3 -0
- package/fixtures/language/format/fail/lost-comment.ia +5 -0
- package/fixtures/language/format/pass/token-spacing.ast.json +100 -0
- package/fixtures/language/format/pass/token-spacing.formatted.txt +7 -0
- package/fixtures/language/format/pass/token-spacing.ia +7 -0
- package/fixtures/language/identity/fail/facet-undeclared.diagnostics.json +1 -0
- package/fixtures/language/identity/fail/facet-undeclared.ia +20 -0
- package/fixtures/language/identity/fail/identity-collision.diagnostics.json +1 -0
- package/fixtures/language/identity/fail/identity-collision.ia +20 -0
- package/fixtures/language/identity/pass/facets.ia +21 -0
- package/fixtures/language/identity/pass/facets.records.json +300 -0
- package/fixtures/language/indent/fail/odd-block-with-prose.diagnostics.json +1 -0
- package/fixtures/language/indent/fail/odd-block-with-prose.ia +6 -0
- package/fixtures/language/indent/fail/odd-block.diagnostics.json +1 -0
- package/fixtures/language/indent/fail/odd-block.ia +4 -0
- package/fixtures/language/indent/fail/odd.diagnostics.json +1 -0
- package/fixtures/language/indent/fail/odd.ia +3 -0
- package/fixtures/language/indent/fail/step-block.diagnostics.json +1 -0
- package/fixtures/language/indent/fail/step-block.ia +4 -0
- package/fixtures/language/indent/fail/step-in-block.diagnostics.json +1 -0
- package/fixtures/language/indent/fail/step-in-block.ia +6 -0
- package/fixtures/language/indent/fail/step-under-header.diagnostics.json +1 -0
- package/fixtures/language/indent/fail/step-under-header.ia +3 -0
- package/fixtures/language/indent/fail/tab-block.diagnostics.json +1 -0
- package/fixtures/language/indent/fail/tab-block.ia +5 -0
- package/fixtures/language/indent/fail/tab.diagnostics.json +1 -0
- package/fixtures/language/indent/fail/tab.ia +3 -0
- package/fixtures/language/indent/fail/under-item.diagnostics.json +1 -0
- package/fixtures/language/indent/fail/under-item.ia +5 -0
- package/fixtures/language/indent/pass/blocks.ast.json +127 -0
- package/fixtures/language/indent/pass/blocks.ia +9 -0
- package/fixtures/language/lists/fail/dash-without-value.diagnostics.json +1 -0
- package/fixtures/language/lists/fail/dash-without-value.ia +4 -0
- package/fixtures/language/lists/fail/empty-item.diagnostics.json +1 -0
- package/fixtures/language/lists/fail/empty-item.ia +4 -0
- package/fixtures/language/lists/fail/item-line-list.diagnostics.json +1 -0
- package/fixtures/language/lists/fail/item-line-list.ia +4 -0
- package/fixtures/language/lists/fail/item-line-prose.diagnostics.json +1 -0
- package/fixtures/language/lists/fail/item-line-prose.ia +4 -0
- package/fixtures/language/lists/fail/missing-separator.diagnostics.json +1 -0
- package/fixtures/language/lists/fail/missing-separator.ia +4 -0
- package/fixtures/language/lists/fail/nested-list.diagnostics.json +1 -0
- package/fixtures/language/lists/fail/nested-list.ia +4 -0
- package/fixtures/language/lists/fail/unterminated.diagnostics.json +1 -0
- package/fixtures/language/lists/fail/unterminated.ia +5 -0
- package/fixtures/language/lists/pass/multi-line.ast.json +117 -0
- package/fixtures/language/lists/pass/multi-line.ia +9 -0
- package/fixtures/language/pragma/fail/missing.diagnostics.json +1 -0
- package/fixtures/language/pragma/fail/missing.ia +1 -0
- package/fixtures/language/pragma/fail/unsupported.diagnostics.json +1 -0
- package/fixtures/language/pragma/fail/unsupported.ia +2 -0
- package/fixtures/language/pragma/pass/minimal.ast.json +20 -0
- package/fixtures/language/pragma/pass/minimal.ia +2 -0
- package/fixtures/language/prose/fail/trailing.diagnostics.json +1 -0
- package/fixtures/language/prose/fail/trailing.ia +4 -0
- package/fixtures/language/prose/fail/unterminated.diagnostics.json +1 -0
- package/fixtures/language/prose/fail/unterminated.ia +5 -0
- package/fixtures/language/prose/pass/paragraphs.ast.json +48 -0
- package/fixtures/language/prose/pass/paragraphs.ia +7 -0
- package/fixtures/language/records/fail/head-after-section.diagnostics.json +1 -0
- package/fixtures/language/records/fail/head-after-section.ia +5 -0
- package/fixtures/language/records/fail/header-discriminator-class.diagnostics.json +1 -0
- package/fixtures/language/records/fail/header-discriminator-class.ia +2 -0
- package/fixtures/language/records/fail/header-extra-token.diagnostics.json +1 -0
- package/fixtures/language/records/fail/header-extra-token.ia +2 -0
- package/fixtures/language/records/fail/header-missing-name.diagnostics.json +1 -0
- package/fixtures/language/records/fail/header-missing-name.ia +2 -0
- package/fixtures/language/records/fail/header-name-class.diagnostics.json +1 -0
- package/fixtures/language/records/fail/header-name-class.ia +2 -0
- package/fixtures/language/records/fail/indented-preamble.diagnostics.json +1 -0
- package/fixtures/language/records/fail/indented-preamble.ia +3 -0
- package/fixtures/language/records/fail/item-under-header.diagnostics.json +1 -0
- package/fixtures/language/records/fail/item-under-header.ia +3 -0
- package/fixtures/language/records/fail/nested-under-header.diagnostics.json +1 -0
- package/fixtures/language/records/fail/nested-under-header.ia +3 -0
- package/fixtures/language/records/fail/toplevel.diagnostics.json +1 -0
- package/fixtures/language/records/fail/toplevel.ia +3 -0
- package/fixtures/language/records/pass/full.ast.json +31 -0
- package/fixtures/language/records/pass/full.ia +11 -0
- package/fixtures/language/refs/fail/discriminator-class.diagnostics.json +1 -0
- package/fixtures/language/refs/fail/discriminator-class.ia +4 -0
- package/fixtures/language/refs/fail/name-class.diagnostics.json +1 -0
- package/fixtures/language/refs/fail/name-class.ia +4 -0
- package/fixtures/language/refs/pass/cell-fragment.ast.json +50 -0
- package/fixtures/language/refs/pass/cell-fragment.ia +4 -0
- package/fixtures/language/refs/pass/fragments.ast.json +104 -0
- package/fixtures/language/refs/pass/fragments.ia +6 -0
- package/fixtures/language/registry/fail/category-missing.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/category-missing.ia +8 -0
- package/fixtures/language/registry/fail/category-unknown.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/category-unknown.ia +9 -0
- package/fixtures/language/registry/fail/condition-in-entry.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/condition-in-entry.ia +9 -0
- package/fixtures/language/registry/fail/condition-on-head.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/condition-on-head.ia +4 -0
- package/fixtures/language/registry/fail/consent-predicate-unknown.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/consent-predicate-unknown.ia +6 -0
- package/fixtures/language/registry/fail/consent-row-malformed.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/consent-row-malformed.ia +6 -0
- package/fixtures/language/registry/fail/discriminator-conflict.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/discriminator-conflict.ia +21 -0
- package/fixtures/language/registry/fail/entry-malformed.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/entry-malformed.ia +6 -0
- package/fixtures/language/registry/fail/facets-missing.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/facets-missing.ia +9 -0
- package/fixtures/language/registry/fail/keyword-reserved.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/keyword-reserved.ia +9 -0
- package/fixtures/language/registry/fail/kind-unknown.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/kind-unknown.ia +9 -0
- package/fixtures/language/registry/fail/provider-missing.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/provider-missing.ia +3 -0
- package/fixtures/language/registry/fail/requires-head-field.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/requires-head-field.ia +5 -0
- package/fixtures/language/registry/fail/retired-interface.diagnostics.json +6 -0
- package/fixtures/language/registry/fail/retired-interface.ia +9 -0
- package/fixtures/language/registry/fail/retired-protocol.diagnostics.json +6 -0
- package/fixtures/language/registry/fail/retired-protocol.ia +9 -0
- package/fixtures/language/registry/fail/retired-shape.diagnostics.json +6 -0
- package/fixtures/language/registry/fail/retired-shape.ia +9 -0
- package/fixtures/language/registry/fail/schema-entry-missing.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/schema-entry-missing.ia +9 -0
- package/fixtures/language/registry/fail/schema-kind-mismatch.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/schema-kind-mismatch.ia +13 -0
- package/fixtures/language/registry/fail/schema-missing.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/schema-missing.ia +9 -0
- package/fixtures/language/registry/fail/system-cycle.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/system-cycle.ia +11 -0
- package/fixtures/language/registry/fail/system-missing.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/system-missing.ia +6 -0
- package/fixtures/language/registry/fail/version-not-semver.diagnostics.json +1 -0
- package/fixtures/language/registry/fail/version-not-semver.ia +4 -0
- package/fixtures/language/registry/pass/requires-order.ia +44 -0
- package/fixtures/language/registry/pass/requires-order.records.json +633 -0
- package/fixtures/language/schema/fail/edge-as-field.diagnostics.json +1 -0
- package/fixtures/language/schema/fail/edge-as-field.ia +7 -0
- package/fixtures/language/schema/fail/edge-cardinality-unknown.diagnostics.json +1 -0
- package/fixtures/language/schema/fail/edge-cardinality-unknown.ia +7 -0
- package/fixtures/language/schema/fail/edge-predicate-unknown.diagnostics.json +1 -0
- package/fixtures/language/schema/fail/edge-predicate-unknown.ia +7 -0
- package/fixtures/language/schema/fail/field-form-unknown.diagnostics.json +1 -0
- package/fixtures/language/schema/fail/field-form-unknown.ia +7 -0
- package/fixtures/language/schema/fail/field-path-malformed.diagnostics.json +1 -0
- package/fixtures/language/schema/fail/field-path-malformed.ia +7 -0
- package/fixtures/language/schema/fail/field-set-not-id.diagnostics.json +1 -0
- package/fixtures/language/schema/fail/field-set-not-id.ia +7 -0
- package/fixtures/language/schema/fail/field-type-unknown.diagnostics.json +1 -0
- package/fixtures/language/schema/fail/field-type-unknown.ia +7 -0
- package/fixtures/language/schema/fail/kind-unknown.diagnostics.json +1 -0
- package/fixtures/language/schema/fail/kind-unknown.ia +5 -0
- package/fixtures/language/schema/fail/lowers-to-missing.diagnostics.json +1 -0
- package/fixtures/language/schema/fail/lowers-to-missing.ia +4 -0
- package/fixtures/language/schema/fail/sections-unclosed.diagnostics.json +1 -0
- package/fixtures/language/schema/fail/sections-unclosed.ia +5 -0
- package/fixtures/language/schema/pass/field-narrowing.ia +13 -0
- package/fixtures/language/schema/pass/field-narrowing.records.json +170 -0
- package/fixtures/language/schema/pass/full-dialect.ia +16 -0
- package/fixtures/language/schema/pass/full-dialect.records.json +179 -0
- package/fixtures/language/selectors/fail/child-condition.diagnostics.json +6 -0
- package/fixtures/language/selectors/fail/child-condition.ia +61 -0
- package/fixtures/language/selectors/fail/dangling-and.diagnostics.json +6 -0
- package/fixtures/language/selectors/fail/dangling-and.ia +60 -0
- package/fixtures/language/selectors/fail/dimension-not-axis.diagnostics.json +6 -0
- package/fixtures/language/selectors/fail/dimension-not-axis.ia +60 -0
- package/fixtures/language/selectors/fail/missing-is.diagnostics.json +6 -0
- package/fixtures/language/selectors/fail/missing-is.ia +60 -0
- package/fixtures/language/selectors/fail/quoted-value.diagnostics.json +6 -0
- package/fixtures/language/selectors/fail/quoted-value.ia +60 -0
- package/fixtures/language/selectors/fail/repeated-axis.diagnostics.json +6 -0
- package/fixtures/language/selectors/fail/repeated-axis.ia +60 -0
- package/fixtures/language/selectors/fail/unknown-axis.diagnostics.json +6 -0
- package/fixtures/language/selectors/fail/unknown-axis.ia +60 -0
- package/fixtures/language/selectors/fail/unknown-value.diagnostics.json +6 -0
- package/fixtures/language/selectors/fail/unknown-value.ia +60 -0
- package/fixtures/language/selectors/fail/wrong-grammar-case.diagnostics.json +6 -0
- package/fixtures/language/selectors/fail/wrong-grammar-case.ia +60 -0
- package/fixtures/language/selectors/pass/all-axes-canonical-values.ia +136 -0
- package/fixtures/language/selectors/pass/all-axes-canonical-values.records.json +2437 -0
- package/fixtures/language/strings/fail/unterminated-block.diagnostics.json +1 -0
- package/fixtures/language/strings/fail/unterminated-block.ia +6 -0
- package/fixtures/language/strings/fail/unterminated.diagnostics.json +1 -0
- package/fixtures/language/strings/fail/unterminated.ia +4 -0
- package/fixtures/language/strings/pass/structural-words.ast.json +21 -0
- package/fixtures/language/strings/pass/structural-words.ia +4 -0
- package/fixtures/language/values/fail/key-missing.diagnostics.json +1 -0
- package/fixtures/language/values/fail/key-missing.ia +4 -0
- package/fixtures/language/values/fail/trailing.diagnostics.json +1 -0
- package/fixtures/language/values/fail/trailing.ia +4 -0
- package/fixtures/language/values/fail/when-empty.diagnostics.json +1 -0
- package/fixtures/language/values/fail/when-empty.ia +4 -0
- package/fixtures/language/values/fail/when-list.diagnostics.json +1 -0
- package/fixtures/language/values/fail/when-list.ia +4 -0
- package/fixtures/language/values/pass/forms.ast.json +177 -0
- package/fixtures/language/values/pass/forms.ia +11 -0
- package/fixtures/language/variants/fail/duplicate-canonical-conjunction.diagnostics.json +14 -0
- package/fixtures/language/variants/fail/duplicate-canonical-conjunction.ia +63 -0
- package/fixtures/language/variants/fail/duplicate-fallback.diagnostics.json +10 -0
- package/fixtures/language/variants/fail/duplicate-fallback.ia +61 -0
- package/fixtures/language/variants/pass/fallback-and-coordinate-families.ia +65 -0
- package/fixtures/language/variants/pass/fallback-and-coordinate-families.records.json +971 -0
- package/fixtures/loop/.ia/src/blocking.ia +8 -0
- package/fixtures/loop/.ia/src/choice-a.ia +9 -0
- package/fixtures/loop/.ia/src/choice-b.ia +9 -0
- package/fixtures/loop/.ia/src/declared-decision.ia +12 -0
- package/fixtures/loop/.ia/src/fallback.ia +9 -0
- package/fixtures/loop/.ia/src/floor/artifact-set.ia +65 -0
- package/fixtures/loop/.ia/src/floor/axis.ia +74 -0
- package/fixtures/loop/.ia/src/floor/cardinality.ia +23 -0
- package/fixtures/loop/.ia/src/floor/category.ia +107 -0
- package/fixtures/loop/.ia/src/floor/dimension.ia +29 -0
- package/fixtures/loop/.ia/src/floor/floor.schema.ia +23 -0
- package/fixtures/loop/.ia/src/floor/intent-shape.ia +73 -0
- package/fixtures/loop/.ia/src/floor/kernel.schema.ia +173 -0
- package/fixtures/loop/.ia/src/floor/kind.ia +59 -0
- package/fixtures/loop/.ia/src/floor/lane.ia +44 -0
- package/fixtures/loop/.ia/src/floor/move.ia +37 -0
- package/fixtures/loop/.ia/src/floor/phase.ia +30 -0
- package/fixtures/loop/.ia/src/floor/placement.ia +42 -0
- package/fixtures/loop/.ia/src/floor/predicate.ia +164 -0
- package/fixtures/loop/.ia/src/floor/primitive.ia +50 -0
- package/fixtures/loop/.ia/src/floor/taxonomy.system.ia +67 -0
- package/fixtures/loop/.ia/src/floor/value-type.ia +44 -0
- package/fixtures/loop/.ia/src/systems/agent-system/records/foreign.ia +9 -0
- package/fixtures/loop/.ia/src/systems/agent-system/records/sample-mandate.ia +8 -0
- package/fixtures/loop/.ia/src/systems/agent-system/schemas/agent.schema.ia +13 -0
- package/fixtures/loop/.ia/src/systems/agent-system/schemas/mandate.schema.ia +12 -0
- package/fixtures/loop/.ia/src/systems/agent-system/steward.ia +9 -0
- package/fixtures/loop/.ia/src/systems/agent-system/system.ia +25 -0
- package/fixtures/loop/.ia/src/systems/compliance-system/cases/foreign-vocabulary.ia +14 -0
- package/fixtures/loop/.ia/src/systems/compliance-system/cases/missing-required-field.ia +14 -0
- package/fixtures/loop/.ia/src/systems/compliance-system/cases/valid-native-record.ia +15 -0
- package/fixtures/loop/.ia/src/systems/compliance-system/checks/instance-schema-check.ia +13 -0
- package/fixtures/loop/.ia/src/systems/compliance-system/contracts/foundation-authoring-contract.ia +15 -0
- package/fixtures/loop/.ia/src/systems/compliance-system/schemas/case.schema.ia +17 -0
- package/fixtures/loop/.ia/src/systems/compliance-system/schemas/check.schema.ia +15 -0
- package/fixtures/loop/.ia/src/systems/compliance-system/schemas/contract.schema.ia +20 -0
- package/fixtures/loop/.ia/src/systems/compliance-system/steward.ia +9 -0
- package/fixtures/loop/.ia/src/systems/compliance-system/system.ia +29 -0
- package/fixtures/loop/.ia/src/systems/governance-system/records/sample-convention.ia +9 -0
- package/fixtures/loop/.ia/src/systems/governance-system/records/sample-principle.ia +9 -0
- package/fixtures/loop/.ia/src/systems/governance-system/records/sample-procedure.ia +44 -0
- package/fixtures/loop/.ia/src/systems/governance-system/records/sample-rule.ia +13 -0
- package/fixtures/loop/.ia/src/systems/governance-system/schemas/convention.schema.ia +13 -0
- package/fixtures/loop/.ia/src/systems/governance-system/schemas/law.schema.ia +13 -0
- package/fixtures/loop/.ia/src/systems/governance-system/schemas/playbook.schema.ia +14 -0
- package/fixtures/loop/.ia/src/systems/governance-system/schemas/principle.schema.ia +13 -0
- package/fixtures/loop/.ia/src/systems/governance-system/steward.ia +9 -0
- package/fixtures/loop/.ia/src/systems/governance-system/system.ia +35 -0
- package/fixtures/loop/.ia/src/systems/session-system/records/sample-session.ia +10 -0
- package/fixtures/loop/.ia/src/systems/session-system/schemas/run.schema.ia +15 -0
- package/fixtures/loop/.ia/src/systems/session-system/steward.ia +9 -0
- package/fixtures/loop/.ia/src/systems/session-system/system.ia +23 -0
- package/fixtures/loop/.ia/src/systems/workspace-system/records/foundation-distribution.ia +8 -0
- package/fixtures/loop/.ia/src/systems/workspace-system/records/foundation-workspace.ia +10 -0
- package/fixtures/loop/.ia/src/systems/workspace-system/schemas/distribution.schema.ia +13 -0
- package/fixtures/loop/.ia/src/systems/workspace-system/schemas/workspace.schema.ia +13 -0
- package/fixtures/loop/.ia/src/systems/workspace-system/steward.ia +9 -0
- package/fixtures/loop/.ia/src/systems/workspace-system/system.ia +26 -0
- package/fixtures/loop/README.md +3 -0
- package/fixtures/loop/SPEC.md +9 -0
- package/fixtures/refusals.ts +434 -0
- package/package.json +129 -3
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { assess } from './types.js';
|
|
2
|
+
import { cite, text } from './record-text.js';
|
|
3
|
+
export { cite, fieldText, governanceClauses, text } from './record-text.js';
|
|
4
|
+
export { LEGACY_STEWARD_TOOLS, REQUIRE_STEWARD_PROFILES, STEWARD_HOST_TABLE } from './steward-profile.js';
|
|
5
|
+
export const PROJECTION_MARKER = '<!-- Generated by tools/projections/generate.ts; edit the cited native records. -->';
|
|
6
|
+
const word = /^[a-z][a-z0-9-]*$/;
|
|
7
|
+
export const invalidAssessment = (message) => Object.freeze({
|
|
8
|
+
assessment: assess('COMP-PROJECTIONS', 'repository', [
|
|
9
|
+
{ code: 'IA-COMP-PROJECTION-INVALID', severity: 'error', path: '.ia/src/systems', line: 1, message },
|
|
10
|
+
]),
|
|
11
|
+
artifacts: Object.freeze([]),
|
|
12
|
+
});
|
|
13
|
+
/**
|
|
14
|
+
* Spec §6.1: the refusal conditions every host renderer shares. Checks, in order: a fresh, matching revision;
|
|
15
|
+
* a portable, non-aliased, correctly rooted membership covering every admitted source; unique record identities;
|
|
16
|
+
* and, per admitted non-floor system, a single unfragmented steward ref resolving to a uniquely named agent
|
|
17
|
+
* declared under that system's own membership root. Callers render artifacts from the returned admission.
|
|
18
|
+
*/
|
|
19
|
+
export function admittedStewards(records, revision, membership) {
|
|
20
|
+
if (!revision.trim() || membership.revision !== revision)
|
|
21
|
+
return invalidAssessment('Projection membership revision is stale');
|
|
22
|
+
const sources = new Set(records.map((r) => r.source.path)), byPath = new Map(), aliases = new Set();
|
|
23
|
+
const portable = (path) => path === path.normalize('NFC') &&
|
|
24
|
+
!/[\\\u0000-\u001f<>:"|?*]/.test(path) &&
|
|
25
|
+
path
|
|
26
|
+
.split('/')
|
|
27
|
+
.every((part) => !!part &&
|
|
28
|
+
part !== '.' &&
|
|
29
|
+
part !== '..' &&
|
|
30
|
+
!/[. ]$/.test(part) &&
|
|
31
|
+
!/^(con|prn|aux|nul|com[0-9]|lpt[0-9])(?:\.|$)/i.test(part));
|
|
32
|
+
for (const member of membership.members) {
|
|
33
|
+
const key = member.path.toLowerCase();
|
|
34
|
+
if (!sources.has(member.path) || aliases.has(key) || !portable(member.path))
|
|
35
|
+
return invalidAssessment('Invalid or conflicting projection membership');
|
|
36
|
+
if (member.system === null
|
|
37
|
+
? member.root !== null
|
|
38
|
+
: !word.test(member.system) ||
|
|
39
|
+
member.root === null ||
|
|
40
|
+
!portable(member.root) ||
|
|
41
|
+
!member.root.endsWith('/' + member.system) ||
|
|
42
|
+
!member.path.startsWith(member.root + '/'))
|
|
43
|
+
return invalidAssessment('Invalid or conflicting projection membership');
|
|
44
|
+
aliases.add(key);
|
|
45
|
+
byPath.set(member.path, member);
|
|
46
|
+
}
|
|
47
|
+
if (records.some((r) => !byPath.has(r.source.path)))
|
|
48
|
+
return invalidAssessment('Projection source membership is unavailable');
|
|
49
|
+
const occurrences = new Set();
|
|
50
|
+
for (const record of records) {
|
|
51
|
+
if (occurrences.has(record.identity))
|
|
52
|
+
return invalidAssessment('Projection requires unique admitted record identities');
|
|
53
|
+
occurrences.add(record.identity);
|
|
54
|
+
}
|
|
55
|
+
const systemRecords = records
|
|
56
|
+
.filter((r) => r.discriminator === 'system' && !r.source.path.startsWith('.ia/src/floor/'))
|
|
57
|
+
.sort((a, b) => (a.name < b.name ? -1 : 1));
|
|
58
|
+
if (systemRecords.length === 0)
|
|
59
|
+
return invalidAssessment('No admitted native systems');
|
|
60
|
+
const names = new Set(), systems = [];
|
|
61
|
+
for (const system of systemRecords) {
|
|
62
|
+
const member = byPath.get(system.source.path);
|
|
63
|
+
const refs = system.head.filter((f) => f.key === 'steward').map((f) => f.value), ref = refs.length === 1 ? refs[0] : undefined;
|
|
64
|
+
const found = ref?.kind === 'ref' && ref.discriminator === 'agent' && ref.fragment === undefined
|
|
65
|
+
? records.filter((r) => r.discriminator === 'agent' && r.name === ref.name && byPath.get(r.source.path)?.system === system.name)
|
|
66
|
+
: [];
|
|
67
|
+
const agent = found.length === 1 ? found[0] : undefined;
|
|
68
|
+
if (!word.test(system.name) ||
|
|
69
|
+
member?.system !== system.name ||
|
|
70
|
+
system.source.path !== member.root + '/system.ia' ||
|
|
71
|
+
agent === undefined ||
|
|
72
|
+
!word.test(agent.name) ||
|
|
73
|
+
names.has(agent.name))
|
|
74
|
+
return invalidAssessment(`Invalid or nonunique host steward for ${system.name}`);
|
|
75
|
+
names.add(agent.name);
|
|
76
|
+
systems.push({ system, member, agent });
|
|
77
|
+
}
|
|
78
|
+
return { byPath, systems };
|
|
79
|
+
}
|
|
80
|
+
/** C22: interpret admitted semantic products; no filesystem or source parser. */
|
|
81
|
+
export function renderHostArtifacts(records, revision, membership, _modes, _options = {}) {
|
|
82
|
+
if (!revision.trim())
|
|
83
|
+
return invalidAssessment('Projection requires a corpus revision');
|
|
84
|
+
// Legacy callers retain their authored-only contract. Adopted callers supply the
|
|
85
|
+
// database's observations; this package neither discovers mounts nor imports db.
|
|
86
|
+
const resolved = membership ?? {
|
|
87
|
+
revision,
|
|
88
|
+
members: [...new Set(records.map((r) => r.source.path))].flatMap((path) => {
|
|
89
|
+
const match = /^(\.ia\/src\/systems\/([a-z][a-z0-9-]*))\//.exec(path);
|
|
90
|
+
return [{ path, system: match?.[2] ?? null, root: match?.[1] ?? null }];
|
|
91
|
+
}),
|
|
92
|
+
};
|
|
93
|
+
const admitted = admittedStewards(records, revision, resolved);
|
|
94
|
+
if ('artifacts' in admitted)
|
|
95
|
+
return admitted;
|
|
96
|
+
const { systems } = admitted;
|
|
97
|
+
const artifacts = [], rows = [];
|
|
98
|
+
for (const { system, agent } of systems) {
|
|
99
|
+
const meaning = agent.sections
|
|
100
|
+
.filter((section) => section.name === 'meaning')
|
|
101
|
+
.flatMap((section) => section.fields)
|
|
102
|
+
.filter((field) => 'key' in field && field.key === 'says')
|
|
103
|
+
.map((field) => ('value' in field ? text(field.value) : ''))
|
|
104
|
+
.join('\n');
|
|
105
|
+
const attribution = `${PROJECTION_MARKER}\n\nSource revision: ${revision}\n\nSources: ${cite(system)}; ${cite(agent)}.`;
|
|
106
|
+
artifacts.push({
|
|
107
|
+
path: `.claude/agents/${agent.name}.md`,
|
|
108
|
+
text: `---\nname: ${agent.name}\ndescription: ${JSON.stringify('Language reference for ' + system.name)}\n---\n\n${attribution}\n\n${meaning}\n\nRead docs/reference/language/vocabulary.json for canonical words and schemas. Validate required fields and references. An admitted declaration does not prove execution or grant authority. Adopted source paths are immutable references.\n`,
|
|
109
|
+
});
|
|
110
|
+
rows.push(`- ${system.name}: ${cite(system)}; ${cite(agent)}.`);
|
|
111
|
+
}
|
|
112
|
+
artifacts.push({
|
|
113
|
+
path: 'CLAUDE.md',
|
|
114
|
+
text: `${PROJECTION_MARKER}\n\n# IA language\n\nSource revision: ${revision}\n\nRead docs/reference/language/README.md and vocabulary.json for language contracts.\n\n${rows.join('\n')}\n`,
|
|
115
|
+
});
|
|
116
|
+
const skill = `---\nname: ia-authoring\ndescription: Author records against the public IA language contracts.\n---\n\n${PROJECTION_MARKER}\n\nRead docs/reference/language/README.md and vocabulary.json. Select the word matching the intended representation, satisfy its canonical schema, and validate references. Execution requires a separately supplied evaluator or host.\n`;
|
|
117
|
+
for (const host of ['.agents', '.claude'])
|
|
118
|
+
artifacts.push({ path: `${host}/skills/ia-authoring/SKILL.md`, text: skill });
|
|
119
|
+
return Object.freeze({
|
|
120
|
+
assessment: assess('COMP-PROJECTIONS', 'repository', []),
|
|
121
|
+
artifacts: Object.freeze(artifacts.map((artifact) => Object.freeze(artifact))),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=projections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projections.js","sourceRoot":"","sources":["../src/projections.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CompiledField, CompiledRecord, CompiledValue } from '@inventarch/language';
|
|
2
|
+
/** Inline text of one compiled value. A block carries its content in its field's children; use fieldText for it. */
|
|
3
|
+
export declare function text(value: CompiledValue): string;
|
|
4
|
+
export declare function cite(record: CompiledRecord): string;
|
|
5
|
+
/** A field's rendered value: inline values as text, a block as one `- ` bullet per nonempty item or nested field. */
|
|
6
|
+
export declare function fieldText(field: CompiledField): string;
|
|
7
|
+
/** The first field `key` directly under the record's `section`. */
|
|
8
|
+
export declare function fieldOf(record: CompiledRecord, section: string, key: string): CompiledField | undefined;
|
|
9
|
+
/** The fields directly under the record's `section`, in authored order. */
|
|
10
|
+
export declare function fieldsOf(record: CompiledRecord, section: string): readonly CompiledField[];
|
|
11
|
+
export declare function says(record: CompiledRecord): string;
|
|
12
|
+
export type Clauses = {
|
|
13
|
+
readonly ok: true;
|
|
14
|
+
readonly text: string;
|
|
15
|
+
} | {
|
|
16
|
+
readonly ok: false;
|
|
17
|
+
readonly key: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Unconditional governance variants named by `keys`, in authored order, as `key: value` or, for a block, `key:` over
|
|
21
|
+
* a bulleted list. An inline empty list (`applies []`) authors "none" and is skipped like an absent clause, never
|
|
22
|
+
* projected as a literal `key: []`. Any other clause that renders empty is refused rather than projected as a bare
|
|
23
|
+
* `key:` line, so content the renderer cannot express is never dropped silently.
|
|
24
|
+
*/
|
|
25
|
+
export declare function governanceClauses(record: CompiledRecord, keys: readonly string[]): Clauses;
|
|
26
|
+
//# sourceMappingURL=record-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-text.d.ts","sourceRoot":"","sources":["../src/record-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAExG,oHAAoH;AACpH,wBAAgB,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAKjD;AACD,wBAAgB,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAEnD;AAMD,qHAAqH;AACrH,wBAAgB,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,CAOtD;AACD,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAKvG;AACD,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,aAAa,EAAE,CAK1F;AACD,wBAAgB,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAKnD;AACD,MAAM,MAAM,OAAO,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAClH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAe1F"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** Inline text of one compiled value. A block carries its content in its field's children; use fieldText for it. */
|
|
2
|
+
export function text(value) {
|
|
3
|
+
if (value.kind === 'scalar' || value.kind === 'string' || value.kind === 'prose')
|
|
4
|
+
return value.text;
|
|
5
|
+
if (value.kind === 'list')
|
|
6
|
+
return value.items.length === 0 ? '[]' : value.items.map(text).join(', ');
|
|
7
|
+
if (value.kind === 'ref')
|
|
8
|
+
return `@${value.discriminator} ${value.name}`;
|
|
9
|
+
return '';
|
|
10
|
+
}
|
|
11
|
+
export function cite(record) {
|
|
12
|
+
return `@${record.discriminator} ${record.name} (${record.source.path}:${record.source.line})`;
|
|
13
|
+
}
|
|
14
|
+
function childLine(child) {
|
|
15
|
+
if ('item' in child)
|
|
16
|
+
return text(child.item);
|
|
17
|
+
const value = fieldText(child);
|
|
18
|
+
return !value ? '' : child.value.kind === 'block' ? `${child.key}:\n${value}` : `${child.key}: ${value}`;
|
|
19
|
+
}
|
|
20
|
+
/** A field's rendered value: inline values as text, a block as one `- ` bullet per nonempty item or nested field. */
|
|
21
|
+
export function fieldText(field) {
|
|
22
|
+
if (field.value.kind !== 'block')
|
|
23
|
+
return text(field.value);
|
|
24
|
+
return (field.fields ?? [])
|
|
25
|
+
.map(childLine)
|
|
26
|
+
.filter((line) => line.trim() !== '')
|
|
27
|
+
.map((line) => '- ' + line.replace(/\n/g, '\n '))
|
|
28
|
+
.join('\n');
|
|
29
|
+
}
|
|
30
|
+
/** The first field `key` directly under the record's `section`. */
|
|
31
|
+
export function fieldOf(record, section, key) {
|
|
32
|
+
return record.sections
|
|
33
|
+
.filter((s) => s.name === section)
|
|
34
|
+
.flatMap((s) => s.fields)
|
|
35
|
+
.find((f) => 'key' in f && f.key === key);
|
|
36
|
+
}
|
|
37
|
+
/** The fields directly under the record's `section`, in authored order. */
|
|
38
|
+
export function fieldsOf(record, section) {
|
|
39
|
+
return record.sections
|
|
40
|
+
.filter((s) => s.name === section)
|
|
41
|
+
.flatMap((s) => s.fields)
|
|
42
|
+
.filter((f) => 'key' in f);
|
|
43
|
+
}
|
|
44
|
+
export function says(record) {
|
|
45
|
+
return fieldsOf(record, 'meaning')
|
|
46
|
+
.filter((f) => f.key === 'says')
|
|
47
|
+
.map(fieldText)
|
|
48
|
+
.join('\n');
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Unconditional governance variants named by `keys`, in authored order, as `key: value` or, for a block, `key:` over
|
|
52
|
+
* a bulleted list. An inline empty list (`applies []`) authors "none" and is skipped like an absent clause, never
|
|
53
|
+
* projected as a literal `key: []`. Any other clause that renders empty is refused rather than projected as a bare
|
|
54
|
+
* `key:` line, so content the renderer cannot express is never dropped silently.
|
|
55
|
+
*/
|
|
56
|
+
export function governanceClauses(record, keys) {
|
|
57
|
+
const governance = fieldsOf(record, 'governance'), rendered = [];
|
|
58
|
+
for (const variant of record.variants) {
|
|
59
|
+
if (variant.condition !== undefined || !keys.includes(variant.key))
|
|
60
|
+
continue;
|
|
61
|
+
if (variant.value.kind === 'list' && variant.value.items.length === 0)
|
|
62
|
+
continue;
|
|
63
|
+
const field = variant.value.kind === 'block'
|
|
64
|
+
? governance.find((f) => f.key === variant.key && f.span.line === variant.span.line)
|
|
65
|
+
: undefined;
|
|
66
|
+
const value = field === undefined ? text(variant.value) : fieldText(field);
|
|
67
|
+
if (value.trim() === '')
|
|
68
|
+
return { ok: false, key: variant.key };
|
|
69
|
+
rendered.push(variant.value.kind === 'block' ? `${variant.key}:\n${value}` : `${variant.key}: ${value}`);
|
|
70
|
+
}
|
|
71
|
+
return { ok: true, text: rendered.join('\n\n') };
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=record-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"record-text.js","sourceRoot":"","sources":["../src/record-text.ts"],"names":[],"mappings":"AAEA,oHAAoH;AACpH,MAAM,UAAU,IAAI,CAAC,KAAoB;IACvC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACpG,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrG,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IACzE,OAAO,EAAE,CAAC;AACZ,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,MAAsB;IACzC,OAAO,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;AACjG,CAAC;AACD,SAAS,SAAS,CAAC,KAAoB;IACrC,IAAI,MAAM,IAAI,KAAK;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;AAC3G,CAAC;AACD,qHAAqH;AACrH,MAAM,UAAU,SAAS,CAAC,KAAoB;IAC5C,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;SACxB,GAAG,CAAC,SAAS,CAAC;SACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;SACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;SACjD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AACD,mEAAmE;AACnE,MAAM,UAAU,OAAO,CAAC,MAAsB,EAAE,OAAe,EAAE,GAAW;IAC1E,OAAO,MAAM,CAAC,QAAQ;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;SACjC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;SACxB,IAAI,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;AAClE,CAAC;AACD,2EAA2E;AAC3E,MAAM,UAAU,QAAQ,CAAC,MAAsB,EAAE,OAAe;IAC9D,OAAO,MAAM,CAAC,QAAQ;SACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;SACjC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;SACxB,MAAM,CAAC,CAAC,CAAC,EAAsB,EAAE,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AACD,MAAM,UAAU,IAAI,CAAC,MAAsB;IACzC,OAAO,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;SAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,MAAM,CAAC;SAC/B,GAAG,CAAC,SAAS,CAAC;SACd,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAsB,EAAE,IAAuB;IAC/E,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/C,QAAQ,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAI,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,SAAS;QAC7E,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAChF,MAAM,KAAK,GACT,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO;YAC5B,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YACpF,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,KAAK,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAC3E,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;QAChE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;AACnD,CAAC"}
|
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { Diagnostic } from '@inventarch/language';
|
|
2
|
+
import type { Coordinate, Graph, Shadow } from '@inventarch/graph';
|
|
3
|
+
import type { AdoptionEvaluators } from './adoption.js';
|
|
4
|
+
import type { EvaluatorCatalog } from './catalog.js';
|
|
5
|
+
import type { SystemFolder } from './systems.js';
|
|
6
|
+
import type { Assessment, Finding, Verdict } from './types.js';
|
|
7
|
+
export interface ReportOptions {
|
|
8
|
+
readonly admission?: readonly Assessment[];
|
|
9
|
+
readonly sourceDiagnostics?: readonly Diagnostic[];
|
|
10
|
+
readonly folders?: readonly SystemFolder[];
|
|
11
|
+
readonly evidence?: ReadonlyMap<'COMP-KERNEL' | 'COMP-FIXTURES', Verdict>;
|
|
12
|
+
readonly adoptionEvaluators?: AdoptionEvaluators;
|
|
13
|
+
readonly coordinate?: Coordinate;
|
|
14
|
+
/** Trusted evaluator catalog (C26). Absent: built-in-only COMP-CHECK, unchanged. */
|
|
15
|
+
readonly catalog?: EvaluatorCatalog;
|
|
16
|
+
}
|
|
17
|
+
export interface Report {
|
|
18
|
+
readonly revision: string;
|
|
19
|
+
readonly outcome: Assessment['outcome'];
|
|
20
|
+
readonly verdicts: readonly Verdict[];
|
|
21
|
+
readonly findings: readonly Finding[];
|
|
22
|
+
readonly shadows: readonly Shadow[];
|
|
23
|
+
}
|
|
24
|
+
export declare function evaluate(graph: Graph, options?: ReportOptions): Report;
|
|
25
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAGnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAYrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE/D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAC3C,QAAQ,CAAC,iBAAiB,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,CAAC,aAAa,GAAG,eAAe,EAAE,OAAO,CAAC,CAAC;IAC1E,QAAQ,CAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACjD,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC,oFAAoF;IACpF,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;CACrC;AACD,MAAM,WAAW,MAAM;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACrC;AAKD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,GAAE,aAAkB,GAAG,MAAM,CAiF1E"}
|
package/dist/report.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { stableSerialize } from '@inventarch/graph';
|
|
2
|
+
import { validateAdoption } from './adoption.js';
|
|
3
|
+
import { assertCatalog } from './catalog.js';
|
|
4
|
+
import { validateCheck, validateConsent, validateCoverage, validateFragments, validateGraphSchema, validateIdentity, validateParse, validateSelectors, } from './graph-checks.js';
|
|
5
|
+
import { validateSystems } from './systems.js';
|
|
6
|
+
import { validateVariants } from './variants.js';
|
|
7
|
+
import { assess, verdict } from './types.js';
|
|
8
|
+
const compare = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
|
|
9
|
+
function unavailable(check, message) {
|
|
10
|
+
return assess(check, 'graph', [{ code: 'IA-COMP-NOT-EVALUATED', severity: 'warning', path: '', line: 1, message }]);
|
|
11
|
+
}
|
|
12
|
+
export function evaluate(graph, options = {}) {
|
|
13
|
+
if (options.catalog !== undefined)
|
|
14
|
+
assertCatalog(options.catalog);
|
|
15
|
+
const nodes = [...graph.nodes.values()];
|
|
16
|
+
const sourceDiagnostics = options.sourceDiagnostics?.filter((d) => d.code !== 'IA-LANG-EDGE-TARGET-MISSING' ||
|
|
17
|
+
!graph.edges.some((edge) => edge.assertions.some((a) => a.source.path === d.path && a.source.line === d.line)));
|
|
18
|
+
const assessments = [
|
|
19
|
+
validateParse(sourceDiagnostics),
|
|
20
|
+
validateConsent(graph),
|
|
21
|
+
validateIdentity(graph),
|
|
22
|
+
validateFragments(graph),
|
|
23
|
+
...validateSystems(options.folders?.map((folder) => ({
|
|
24
|
+
...folder,
|
|
25
|
+
records: nodes.filter((node) => (folder.roots ?? [folder.path]).some((root) => node.source.path.startsWith(root + '/'))),
|
|
26
|
+
})) ?? [], graph.registry, nodes),
|
|
27
|
+
...validateAdoption(graph, options.adoptionEvaluators, options.coordinate),
|
|
28
|
+
];
|
|
29
|
+
assessments.push(...(options.admission?.filter((a) => a.outcome !== 'pass') ?? []));
|
|
30
|
+
if (options.folders === undefined)
|
|
31
|
+
for (const check of ['COMP-SYSTEM', 'COMP-STEWARD'])
|
|
32
|
+
assessments.push(unavailable(check, 'System folder discovery observations were not supplied'));
|
|
33
|
+
for (const node of nodes) {
|
|
34
|
+
assessments.push(validateGraphSchema(node, graph), validateSelectors(node), validateVariants(node));
|
|
35
|
+
if (node.discriminator === 'contract')
|
|
36
|
+
assessments.push(validateCoverage(node, graph));
|
|
37
|
+
if (node.discriminator === 'check')
|
|
38
|
+
assessments.push(validateCheck(node, options.catalog));
|
|
39
|
+
}
|
|
40
|
+
for (const diagnostic of graph.diagnostics)
|
|
41
|
+
if (diagnostic.code === 'IA-GRAPH-DIMENSION-UNKNOWN')
|
|
42
|
+
assessments.push(assess('COMP-SCHEMA', `${diagnostic.path}:${diagnostic.line}`, [diagnostic]));
|
|
43
|
+
for (const check of ['COMP-KERNEL', 'COMP-FIXTURES']) {
|
|
44
|
+
const evidence = options.evidence?.get(check);
|
|
45
|
+
assessments.push(evidence === undefined || evidence.revision !== graph.revision || evidence.check !== check
|
|
46
|
+
? unavailable(check, `${check}: matching-revision verification evidence was not supplied`)
|
|
47
|
+
: evidence);
|
|
48
|
+
}
|
|
49
|
+
const grouped = new Map();
|
|
50
|
+
const rank = { pass: 0, 'not-evaluated': 1, fail: 2 };
|
|
51
|
+
for (const assessment of assessments) {
|
|
52
|
+
const key = stableSerialize([assessment.check, assessment.scope]), previous = grouped.get(key);
|
|
53
|
+
if (previous === undefined) {
|
|
54
|
+
grouped.set(key, assessment);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const findings = new Map([...previous.findings, ...assessment.findings].map((f) => [stableSerialize(f), f]));
|
|
58
|
+
const outcome = rank[assessment.outcome] > rank[previous.outcome] ? assessment.outcome : previous.outcome;
|
|
59
|
+
grouped.set(key, { ...assess(assessment.check, assessment.scope, [...findings.values()]), outcome });
|
|
60
|
+
}
|
|
61
|
+
const verdicts = Object.freeze([...grouped.values()]
|
|
62
|
+
.map((a) => verdict(a, graph.revision))
|
|
63
|
+
.sort((a, b) => compare(a.check, b.check) || compare(a.scope, b.scope)));
|
|
64
|
+
const findings = new Map();
|
|
65
|
+
for (const result of verdicts)
|
|
66
|
+
for (const item of result.findings)
|
|
67
|
+
findings.set(stableSerialize(item), item);
|
|
68
|
+
return Object.freeze({
|
|
69
|
+
revision: graph.revision,
|
|
70
|
+
outcome: verdicts.some((v) => v.outcome === 'fail')
|
|
71
|
+
? 'fail'
|
|
72
|
+
: verdicts.some((v) => v.outcome === 'not-evaluated')
|
|
73
|
+
? 'not-evaluated'
|
|
74
|
+
: 'pass',
|
|
75
|
+
verdicts,
|
|
76
|
+
findings: Object.freeze([...findings.values()].sort((a, b) => compare(a.path, b.path) || a.line - b.line || compare(a.code, b.code) || compare(a.message, b.message))),
|
|
77
|
+
shadows: graph.shadows,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { CompiledEdge, CompiledRecord, EdgeReference, FrozenRegistry, ResolutionCandidate, SchemaDeclaration, SchemaEdge, Span } from '@inventarch/language';
|
|
2
|
+
import type { Assessment, CompCode, Finding } from './types.js';
|
|
3
|
+
/** Whether a typed reference field names at least one admitted record (W0-L2). Absent, no `IA-COMP-FIELD-REF-MISSING` warning is raised. */
|
|
4
|
+
export type ReferenceLookup = (reference: EdgeReference) => boolean;
|
|
5
|
+
/**
|
|
6
|
+
* One lookup per pool array, built on first use and kept for the pool's lifetime, over language's `indexedResolver`:
|
|
7
|
+
* the whole pool is validated once on first use (an inconsistent candidate anywhere in it faults that first lookup),
|
|
8
|
+
* then each reference resolves against the candidates of its own name only, so a lookup is O(1) per reference.
|
|
9
|
+
* `subject` also resolves when it is not in the pool.
|
|
10
|
+
*/
|
|
11
|
+
export declare function poolLookup(registry: FrozenRegistry, pool: readonly ResolutionCandidate[], subject?: ResolutionCandidate): ReferenceLookup;
|
|
12
|
+
export declare function validateSchema(record: CompiledRecord, registry: FrozenRegistry, pool: readonly CompiledRecord[]): Assessment;
|
|
13
|
+
/** Shared structural checks; graph supplies its own admitted active relationships. */
|
|
14
|
+
export declare function schemaStructure(record: CompiledRecord, registry: FrozenRegistry, exists?: ReferenceLookup): {
|
|
15
|
+
findings: Finding[];
|
|
16
|
+
schema?: SchemaDeclaration;
|
|
17
|
+
};
|
|
18
|
+
export declare function schemaReporter(record: CompiledRecord, findings: Finding[]): Add;
|
|
19
|
+
type Add = (code: CompCode, span: Span, message: string, warning?: boolean) => void;
|
|
20
|
+
export declare function matchesTarget(record: CompiledRecord, rule: SchemaEdge): boolean;
|
|
21
|
+
export declare function couldMatch(edge: CompiledEdge, rule: SchemaEdge, registry: FrozenRegistry): boolean;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,YAAY,EAEZ,cAAc,EAGd,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EAEV,IAAI,EACL,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAEhE,4IAA4I;AAC5I,MAAM,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,aAAa,KAAK,OAAO,CAAC;AACpE;;;;;GAKG;AACH,wBAAgB,UAAU,CACxB,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,SAAS,mBAAmB,EAAE,EACpC,OAAO,CAAC,EAAE,mBAAmB,GAC5B,eAAe,CAejB;AAQD,wBAAgB,cAAc,CAC5B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,cAAc,EACxB,IAAI,EAAE,SAAS,cAAc,EAAE,GAC9B,UAAU,CAgDZ;AAED,sFAAsF;AACtF,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,cAAc,EACxB,MAAM,CAAC,EAAE,eAAe,GACvB;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,iBAAiB,CAAA;CAAE,CAcrD;AACD,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,GAAG,CAW/E;AAED,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAiJpF,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAE/E;AACD,wBAAgB,UAAU,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAclG"}
|
package/dist/schema.js
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { DIMENSION_PATHS, indexedResolver, isKind, resolveTarget } from '@inventarch/language';
|
|
2
|
+
import { isListType, matchesForm, matchesType } from './values.js';
|
|
3
|
+
import { assess } from './types.js';
|
|
4
|
+
/**
|
|
5
|
+
* One lookup per pool array, built on first use and kept for the pool's lifetime, over language's `indexedResolver`:
|
|
6
|
+
* the whole pool is validated once on first use (an inconsistent candidate anywhere in it faults that first lookup),
|
|
7
|
+
* then each reference resolves against the candidates of its own name only, so a lookup is O(1) per reference.
|
|
8
|
+
* `subject` also resolves when it is not in the pool.
|
|
9
|
+
*/
|
|
10
|
+
export function poolLookup(registry, pool, subject) {
|
|
11
|
+
let byRegistry = lookups.get(pool);
|
|
12
|
+
if (byRegistry === undefined) {
|
|
13
|
+
byRegistry = new WeakMap();
|
|
14
|
+
lookups.set(pool, byRegistry);
|
|
15
|
+
}
|
|
16
|
+
let indexed = byRegistry.get(registry);
|
|
17
|
+
if (indexed === undefined) {
|
|
18
|
+
indexed = lazily(() => indexedResolver(registry, pool));
|
|
19
|
+
byRegistry.set(registry, indexed);
|
|
20
|
+
}
|
|
21
|
+
const resolver = indexed;
|
|
22
|
+
return (reference) => resolver()(reference).kind !== 'missing' ||
|
|
23
|
+
(subject !== undefined && resolveTarget(reference, registry, [subject]).kind !== 'missing');
|
|
24
|
+
}
|
|
25
|
+
const lookups = new WeakMap();
|
|
26
|
+
function lazily(build) {
|
|
27
|
+
let built;
|
|
28
|
+
return () => (built ??= { value: build() }).value;
|
|
29
|
+
}
|
|
30
|
+
export function validateSchema(record, registry, pool) {
|
|
31
|
+
const all = [record, ...pool.filter((r) => !sameOccurrence(r, record))];
|
|
32
|
+
const { findings, schema } = schemaStructure(record, registry, poolLookup(registry, pool, record));
|
|
33
|
+
const add = schemaReporter(record, findings);
|
|
34
|
+
if (schema !== undefined) {
|
|
35
|
+
for (const rule of schema.edges) {
|
|
36
|
+
const targets = new Set();
|
|
37
|
+
let uncertain = false;
|
|
38
|
+
for (const author of all)
|
|
39
|
+
for (const edge of author.edges) {
|
|
40
|
+
if (edge.predicate !== rule.predicate)
|
|
41
|
+
continue;
|
|
42
|
+
if (sameOccurrence(author, record) && edge.direction === 'out') {
|
|
43
|
+
const resolved = edge.target === null ? [] : all.filter((r) => r.identity === edge.target);
|
|
44
|
+
if (resolved.length === 1) {
|
|
45
|
+
const target = resolved[0];
|
|
46
|
+
if (!matchesTarget(target, rule))
|
|
47
|
+
continue;
|
|
48
|
+
if (edge.condition !== undefined)
|
|
49
|
+
uncertain = true;
|
|
50
|
+
else
|
|
51
|
+
targets.add(`${target.identity}#${edge.fragment ?? ''}`);
|
|
52
|
+
}
|
|
53
|
+
else if (couldMatch(edge, rule, registry))
|
|
54
|
+
uncertain = true;
|
|
55
|
+
}
|
|
56
|
+
else if (edge.direction === 'in' && matchesTarget(author, rule)) {
|
|
57
|
+
// Inbound assertion on another record: subject -> author in active direction.
|
|
58
|
+
const refersHere = edge.target === record.identity ||
|
|
59
|
+
(edge.target === null && resolveTarget(edge.reference, registry, [record]).kind === 'resolved');
|
|
60
|
+
if (!refersHere)
|
|
61
|
+
continue;
|
|
62
|
+
if (edge.target === null || edge.condition !== undefined)
|
|
63
|
+
uncertain = true;
|
|
64
|
+
else
|
|
65
|
+
targets.add(`${author.identity}#`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
const minimum = rule.must && rule.cardinality !== 'optional' ? 1 : 0;
|
|
69
|
+
const maximum = rule.cardinality === 'one-or-more' ? Infinity : 1;
|
|
70
|
+
if (targets.size > maximum || (targets.size < minimum && !uncertain)) {
|
|
71
|
+
add('IA-COMP-EDGE-CARDINALITY', record.source, `${rule.predicate} ${rule.target} requires ${rule.must ? 'must' : 'may'} ${rule.cardinality}; found ${targets.size} definite targets`);
|
|
72
|
+
}
|
|
73
|
+
else if (uncertain && (targets.size < minimum || maximum !== Infinity)) {
|
|
74
|
+
add('IA-COMP-EDGE-UNRESOLVED', record.source, `${rule.predicate} ${rule.target} ${rule.cardinality} cannot be decided with unresolved targets or conditions`, true);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return assess('COMP-SCHEMA', record.identity, findings);
|
|
79
|
+
}
|
|
80
|
+
/** Shared structural checks; graph supplies its own admitted active relationships. */
|
|
81
|
+
export function schemaStructure(record, registry, exists) {
|
|
82
|
+
const findings = [], add = schemaReporter(record, findings);
|
|
83
|
+
const registration = registry.registrations.get(record.discriminator);
|
|
84
|
+
const schema = registration === undefined ? undefined : registry.schemas.get(registration.schema);
|
|
85
|
+
if (schema === undefined)
|
|
86
|
+
add('IA-COMP-SCHEMA-MISSING', record.source, `no schema is available for '${record.discriminator}'`);
|
|
87
|
+
else if (schema.kind !== record.kind || registration?.kind !== record.kind)
|
|
88
|
+
add('IA-COMP-SCHEMA-KIND-MISMATCH', record.source, `@schema ${schema.name} does not lower to ${record.kind}`);
|
|
89
|
+
else {
|
|
90
|
+
validateFields(record, schema, add, exists);
|
|
91
|
+
return { findings, schema };
|
|
92
|
+
}
|
|
93
|
+
return { findings };
|
|
94
|
+
}
|
|
95
|
+
export function schemaReporter(record, findings) {
|
|
96
|
+
return (code, span, message, warning = false) => {
|
|
97
|
+
findings.push({
|
|
98
|
+
code,
|
|
99
|
+
severity: warning ? 'warning' : 'error',
|
|
100
|
+
path: record.source.path,
|
|
101
|
+
...span,
|
|
102
|
+
identity: record.identity,
|
|
103
|
+
message: `${record.source.path}:${span.line}: ${record.identity}: ${message}`,
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
const fieldsOnly = (children) => children.filter((c) => 'key' in c);
|
|
108
|
+
/** Floor grammar sections the language reads itself: their children lower to edges, cells and selectors, never to ordinary fields. */
|
|
109
|
+
const GRAMMAR_SECTIONS = ['relationships', 'cognition', 'activation'];
|
|
110
|
+
/** The two floor dialect words: the body of a `@schema` or `@system` record is the dialect the language reads (spec 4.2, 4.3), not fields. */
|
|
111
|
+
const DIALECT_WORDS = ['schema', 'system'];
|
|
112
|
+
/** `section.key` paths the graph reads as kernel dimension coordinates (today `governance.severity`); the bare head paths never match a body field. */
|
|
113
|
+
const DIMENSION_FIELDS = new Set(Object.values(DIMENSION_PATHS));
|
|
114
|
+
const spanKey = (span) => `${span.line}:${span.endLine}`;
|
|
115
|
+
function validateFields(record, schema, add, exists) {
|
|
116
|
+
const missingSections = new Set();
|
|
117
|
+
for (const rule of schema.sections) {
|
|
118
|
+
if (rule.must && rule.name !== 'head' && !record.sections.some((s) => s.name === rule.name)) {
|
|
119
|
+
missingSections.add(rule.name);
|
|
120
|
+
add('IA-COMP-SECTION-MISSING', record.source, `@schema ${schema.name} requires section '${rule.name}'`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (schema.closed)
|
|
124
|
+
for (const section of record.sections) {
|
|
125
|
+
if (['cognition', 'activation'].includes(section.name))
|
|
126
|
+
continue;
|
|
127
|
+
if (!schema.sections.some((r) => r.name === section.name))
|
|
128
|
+
add('IA-COMP-SECTION-UNKNOWN', section.span, `closed @schema ${schema.name} does not admit section '${section.name}'`);
|
|
129
|
+
else
|
|
130
|
+
validateKeys(record, schema, section, add);
|
|
131
|
+
}
|
|
132
|
+
for (const rule of schema.fields) {
|
|
133
|
+
if (missingSections.has(rule.section))
|
|
134
|
+
continue;
|
|
135
|
+
const sections = record.sections.filter((s) => s.name === rule.section);
|
|
136
|
+
if (rule.section !== 'head' &&
|
|
137
|
+
sections.length === 0 &&
|
|
138
|
+
schema.sections.some((s) => s.name === rule.section && !s.must))
|
|
139
|
+
continue;
|
|
140
|
+
const roots = rule.section === 'head' ? record.head : sections.flatMap((s) => fieldsOnly(s.fields));
|
|
141
|
+
const matches = roots.filter((field) => field.key === rule.key);
|
|
142
|
+
if (matches.length === 0 && rule.must)
|
|
143
|
+
add('IA-COMP-FIELD-MISSING', sections[0]?.span ?? record.source, `@schema ${schema.name} requires '${rule.section}.${rule.key}'`);
|
|
144
|
+
// D3: a declared non-list key is exactly one field; `list of T` is the only type a key may carry more than once. One finding per rule, at the second occurrence.
|
|
145
|
+
else if (matches.length > 1 && !isListType(rule.type))
|
|
146
|
+
add('IA-COMP-FIELD-DUPLICATE', matches[1].span, `'${rule.section}.${rule.key}' is declared once by @schema ${schema.name}; found ${matches.length} occurrences`);
|
|
147
|
+
for (const field of matches) {
|
|
148
|
+
if (!matchesType(field.value, rule.type))
|
|
149
|
+
add('IA-COMP-FIELD-TYPE', field.span, `'${rule.section}.${rule.key}' requires ${rule.type}; found ${field.value.kind}`);
|
|
150
|
+
else
|
|
151
|
+
validateNarrowing(field, rule, add, exists);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* D1 (W0-L4, work-system design O-6, 2026-09-25): under `closed`, a declared body section admits only the keys the schema
|
|
157
|
+
* declares for it; every other ordinary field is `IA-COMP-FIELD-UNKNOWN` at its own span, nested children folded into
|
|
158
|
+
* their block's one finding. An ordinary field is a compiled field the compiler left as a field. It is not one when:
|
|
159
|
+
* - its section is floor grammar (`relationships` lower to edges, `cognition` to cells, `activation` to selectors),
|
|
160
|
+
* which the language reads and refuses itself;
|
|
161
|
+
* - the compiler consumed it as a semantic product: a governance variant clause (its span is one of `record.variants`;
|
|
162
|
+
* `readVariants` takes every `governance` field except `severity` and `when`) or a contract requirement clause
|
|
163
|
+
* (its span is one of `record.requirements`, the `REQ-*` lines under inputs, outputs, failures and their kin);
|
|
164
|
+
* - its `section.key` path is a kernel dimension (`DIMENSION_PATHS`, today `governance.severity`), which the graph
|
|
165
|
+
* reads as a coordinate, not a field.
|
|
166
|
+
* Records of the two floor dialect words are exempt: a `@schema` body (`sections.must have`, `fields.may have`,
|
|
167
|
+
* `edges.may`, `closed`) and a `@system` body are the dialect the language reads itself, not fields; `@schema schema`
|
|
168
|
+
* is closed and declares no field. The head is a virtual section and stays open here.
|
|
169
|
+
*/
|
|
170
|
+
function validateKeys(record, schema, section, add) {
|
|
171
|
+
if (DIALECT_WORDS.includes(record.discriminator) || GRAMMAR_SECTIONS.includes(section.name))
|
|
172
|
+
return;
|
|
173
|
+
const consumed = new Set([...record.variants, ...record.requirements].map((product) => spanKey(product.span)));
|
|
174
|
+
for (const field of fieldsOnly(section.fields)) {
|
|
175
|
+
if (schema.fields.some((rule) => rule.section === section.name && rule.key === field.key))
|
|
176
|
+
continue;
|
|
177
|
+
if (DIMENSION_FIELDS.has(`${section.name}.${field.key}`) || consumed.has(spanKey(field.span)))
|
|
178
|
+
continue;
|
|
179
|
+
add('IA-COMP-FIELD-UNKNOWN', field.span, `closed @schema ${schema.name} does not declare '${section.name}.${field.key}'`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** The W0 narrowings over a value that already matches its type; one finding per field and narrowing, list items included. */
|
|
183
|
+
function validateNarrowing(field, rule, add, exists) {
|
|
184
|
+
const path = `'${rule.section}.${rule.key}'`;
|
|
185
|
+
const items = field.value.kind === 'list' ? field.value.items : [field.value];
|
|
186
|
+
const texts = items.filter((item) => 'text' in item);
|
|
187
|
+
if (rule.values !== undefined) {
|
|
188
|
+
const outside = texts.filter((item) => !rule.values.includes(item.text));
|
|
189
|
+
if (outside.length > 0)
|
|
190
|
+
add('IA-COMP-FIELD-VALUE', field.span, `${path} admits one of ${rule.values.join(', ')}; found ${outside.map((item) => JSON.stringify(item.text)).join(', ')}`);
|
|
191
|
+
}
|
|
192
|
+
if (rule.target !== undefined) {
|
|
193
|
+
const references = items.filter((item) => item.kind === 'ref');
|
|
194
|
+
const foreign = references.find((reference) => reference.discriminator !== rule.target);
|
|
195
|
+
if (foreign !== undefined)
|
|
196
|
+
add('IA-COMP-FIELD-REF-TARGET', field.span, `${path} requires ref to ${rule.target}; found @${foreign.discriminator} ${foreign.name}`);
|
|
197
|
+
else if (exists !== undefined) {
|
|
198
|
+
const missing = references.find((reference) => !exists({ kind: 'ref', discriminator: reference.discriminator, name: reference.name }));
|
|
199
|
+
if (missing !== undefined)
|
|
200
|
+
add('IA-COMP-FIELD-REF-MISSING', field.span, `${path} names @${missing.discriminator} ${missing.name}, which no admitted record declares`, true);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (rule.form !== undefined) {
|
|
204
|
+
const malformed = texts.filter((item) => !matchesForm(item.text, rule.form));
|
|
205
|
+
if (malformed.length > 0)
|
|
206
|
+
add('IA-COMP-FIELD-FORM', field.span, `${path} requires text form ${rule.form}; found ${malformed.map((item) => JSON.stringify(item.text)).join(', ')}`);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
function sameOccurrence(a, b) {
|
|
210
|
+
return a.identity === b.identity && a.source.path === b.source.path && a.source.line === b.source.line;
|
|
211
|
+
}
|
|
212
|
+
export function matchesTarget(record, rule) {
|
|
213
|
+
return isKind(rule.target) ? record.kind === rule.target : record.discriminator === rule.target;
|
|
214
|
+
}
|
|
215
|
+
export function couldMatch(edge, rule, registry) {
|
|
216
|
+
if (edge.reference.kind === 'ref') {
|
|
217
|
+
const registration = registry.registrations.get(edge.reference.discriminator);
|
|
218
|
+
return isKind(rule.target) ? registration?.kind === rule.target : edge.reference.discriminator === rule.target;
|
|
219
|
+
}
|
|
220
|
+
const [system, kind, facet] = edge.reference.identity.split('/');
|
|
221
|
+
if (isKind(rule.target))
|
|
222
|
+
return kind === rule.target;
|
|
223
|
+
const registration = registry.registrations.get(rule.target);
|
|
224
|
+
return (registration !== undefined &&
|
|
225
|
+
registration.system === system &&
|
|
226
|
+
registration.kind === kind &&
|
|
227
|
+
registration.facets.includes(facet ?? ''));
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=schema.js.map
|