@warpgogol/werkstatt-shared 0.14.1 → 0.16.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/README.md +23 -15
- package/README.uk.md +1 -1
- package/package.json +534 -766
- package/src/{share/agent → agent}/api-catalog.ts +14 -1
- package/src/{share/agent → agent}/ard-catalog.ts +6 -1
- package/src/{share/agent → agent}/dns-aid.test.ts +2 -2
- package/src/agent/guidance.ts +52 -0
- package/src/agent/health.ts +68 -0
- package/src/{share/agent → agent}/index.ts +5 -1
- package/src/{share/agent → agent}/manifest.ts +83 -6
- package/src/{share/agent → agent}/openapi.ts +97 -4
- package/src/agent/receipt.ts +123 -0
- package/src/{share/agent → agent}/search.test.ts +3 -0
- package/src/{share/agent → agent}/search.ts +31 -5
- package/src/{share → agent}/tests/api-catalog.test.ts +8 -2
- package/src/{share → agent}/tests/ard-catalog.test.ts +11 -2
- package/src/{share → agent}/tests/capability.test.ts +1 -1
- package/src/{share → agent}/tests/fleet-catalog.test.ts +1 -1
- package/src/{share → agent}/tests/knowledge.test.ts +2 -2
- package/src/{share → agent}/tests/manifest.test.ts +72 -1
- package/src/{share → agent}/tests/mcp-card.test.ts +6 -2
- package/src/{share → agent}/tests/openapi.test.ts +119 -2
- package/src/{share → agent}/tests/proof.test.ts +1 -1
- package/src/{share → attribution}/material-credits.ts +4 -4
- package/src/{share → checks}/check-hints.ts +6 -1
- package/src/checks/index.ts +4 -1
- package/src/checks/lib/astro-site-url.ts +6 -1
- package/src/checks/lib/i18n.ts +14 -0
- package/src/checks/result-helpers.ts +2 -2
- package/src/checks/tests/remediation-auto-populate.test.ts +1 -1
- package/src/{share → client-scripts}/counter-utils.ts +6 -2
- package/src/{share/scripts → client-scripts}/external-link-qr.ts +11 -16
- package/src/{share/scripts → client-scripts}/external-links.ts +12 -1
- package/src/{share/scripts → client-scripts}/gsap-counter.ts +8 -3
- package/src/client-scripts/index.ts +35 -0
- package/src/{share/scripts → client-scripts}/inline-number-animation.ts +1 -1
- package/src/{share/scripts → client-scripts}/lenis.ts +6 -1
- package/src/{share/scripts → client-scripts}/lordicon.ts +6 -1
- package/src/{share/scripts → client-scripts}/orchestrator.ts +10 -1
- package/src/{share/scripts → client-scripts}/scheduler.ts +6 -1
- package/src/client-scripts/scroll-spy.ts +106 -0
- package/src/client-scripts/tests/orchestrator.test.ts +47 -0
- package/src/client-scripts/tests/scroll-spy.test.ts +204 -0
- package/src/{share/scripts → client-scripts/tests}/video-player.test.ts +51 -31
- package/src/component/contracts.ts +206 -0
- package/src/component/index.ts +13 -0
- package/src/{share → content}/content-reference.ts +3 -3
- package/src/{share/content → content}/entity-id.ts +6 -3
- package/src/content/index.ts +3 -0
- package/src/{share/content → content}/merge.ts +6 -1
- package/src/content/system-manifest.test.ts +107 -0
- package/src/content/system-manifest.ts +12 -94
- package/src/{share → content}/tests/resolve-field-path.test.ts +1 -1
- package/src/{share → content}/tests/substitute-deep.test.ts +1 -1
- package/src/content-discipline/index.ts +19 -0
- package/src/{share/content-discipline → content-discipline}/parsers.ts +2 -2
- package/src/{share/env.d.ts → env.d.ts} +6 -3
- package/src/fingerprint/canonical-json.ts +731 -0
- package/src/fingerprint/index.ts +14 -0
- package/src/fingerprint/primitives.ts +72 -0
- package/src/{share/i18n → i18n}/localization.ts +6 -2
- package/src/integration/adapters.ts +10 -71
- package/src/integration/dispatch.ts +1 -1
- package/src/integration/funnel.ts +6 -1
- package/src/integration/idempotency.ts +88 -0
- package/src/integration/index.ts +105 -4
- package/src/integration/lagebild-destination-adapter.ts +108 -0
- package/src/integration/lagebild-ingress.ts +7 -12
- package/src/integration/orchestration.ts +11 -10
- package/src/integration/tests/deliver-event.test.ts +1 -1
- package/src/integration/tests/dispatch.test.ts +4 -4
- package/src/integration/tests/hub-runtime.test.ts +22 -14
- package/src/integration/tests/idempotency.test.ts +81 -0
- package/src/integration/vitest.config.ts +1 -0
- package/src/kernel/desired-state.ts +227 -0
- package/src/kernel/diagnostic.ts +289 -0
- package/src/kernel/drift-guard.ts +166 -0
- package/src/kernel/fs-atomic.ts +131 -0
- package/src/kernel/index.ts +22 -0
- package/src/kernel/tests/drift-guard.test.ts +112 -0
- package/src/kernel/tests/fs-atomic.test.ts +150 -0
- package/src/kernel/tests/workpiece-env.test.ts +44 -0
- package/src/kernel/tests/workspace-io.test.ts +187 -0
- package/src/kernel/types.ts +518 -0
- package/src/kernel/workpiece-env.ts +48 -0
- package/src/kernel/workspace-io.ts +248 -0
- package/src/{share → knowledge}/tests/claim.test.ts +1 -1
- package/src/{share → knowledge}/tests/derivation.test.ts +1 -1
- package/src/{share → knowledge}/tests/freshness.test.ts +1 -1
- package/src/{share → knowledge}/tests/ledger.test.ts +1 -1
- package/src/{share → knowledge}/tests/plan.test.ts +1 -1
- package/src/{share → knowledge}/tests/source.test.ts +1 -1
- package/src/legal/index.ts +15 -0
- package/src/{share/middleware → middleware}/access-protection.ts +11 -8
- package/src/{share/middleware → middleware}/language-redirect.ts +3 -0
- package/src/{share → node}/dev-props-validator.ts +6 -1
- package/src/{share → node}/import-scan.ts +23 -3
- package/src/{share → node}/semantic/derived-prices-loader.ts +4 -2
- package/src/{share → node}/semantic/markdown-twin-provenance.ts +1 -1
- package/src/{share/semantic → node}/tests/derived-prices-loader.test.ts +14 -1
- package/src/{share/semantic → node}/tests/markdown-twin-provenance.test.ts +1 -1
- package/src/observability/env-resolver.ts +6 -1
- package/src/observability/index.ts +14 -1
- package/src/observability/otlp-converter.ts +6 -1
- package/src/observability/otlp-transport.ts +6 -1
- package/src/observability/pipeline-log.ts +81 -0
- package/src/observability/pusher.ts +6 -1
- package/src/observability/redact.ts +6 -1
- package/src/observability/typed-refs.ts +6 -2
- package/src/observability/vitest.config.ts +1 -0
- package/src/{share → offers}/formula-eval.ts +3 -3
- package/src/{share → offers}/tests/formula-eval.test.ts +2 -2
- package/src/onboarding/index.ts +1 -0
- package/src/{share → onboarding}/tests/onboarding-yaml.test.ts +1 -1
- package/src/ontology/archetype-registry.ts +6 -1
- package/src/ontology/archetypes/index.json +33 -1
- package/src/ontology/archetypes/index.yaml +27 -1
- package/src/ontology/archetypes/sections/entity-grid.yaml +46 -0
- package/src/ontology/archetypes/sections/exit-diagram.yaml +43 -0
- package/src/ontology/biome-token-projection.ts +6 -1
- package/src/ontology/capabilities/lead.prepare.yaml +44 -0
- package/src/ontology/capabilities/lead.submit.yaml +20 -3
- package/src/ontology/cosmic/index.ts +6 -1
- package/src/ontology/cosmic/moon-catalog.ts +6 -1
- package/src/ontology/cosmic/planet-catalog.ts +6 -1
- package/src/ontology/cosmic/star-catalog.ts +6 -1
- package/src/ontology/enums.ts +6 -1
- package/src/ontology/external-surfaces/index.ts +1 -1
- package/src/ontology/index.ts +6 -2
- package/src/ontology/manifest.ts +7 -4
- package/src/ontology/operations/artifact-store.ts +45 -0
- package/src/ontology/operations/dht.ts +98 -0
- package/src/ontology/operations/handoff.ts +92 -0
- package/src/ontology/operations/index.ts +193 -1
- package/src/ontology/operations/leitstand.ts +99 -0
- package/src/ontology/operations/materialization.ts +90 -0
- package/src/ontology/operations/mission.ts +111 -0
- package/src/ontology/operations/naming-policy.ts +132 -0
- package/src/ontology/operations/notausgang.ts +108 -0
- package/src/ontology/operations/release.ts +121 -0
- package/src/ontology/operations/sternsystem.ts +192 -0
- package/src/ontology/operations/werkstatt.ts +48 -0
- package/src/ontology/schemas/biome.ts +7 -2
- package/src/ontology/schemas/capability.ts +56 -4
- package/src/ontology/schemas/constellation.ts +6 -1
- package/src/ontology/schemas/index.ts +6 -2
- package/src/ontology/schemas/manifest-resolver.ts +6 -1
- package/src/ontology/schemas/page-entry.ts +9 -5
- package/src/ontology/schemas/system/growth.ts +6 -1
- package/src/ontology/schemas/system/manifest.ts +40 -1
- package/src/ontology/schemas/system/page-output.ts +7 -6
- package/src/ontology/schemas/system/text.ts +15 -0
- package/src/ontology/schemas/system.ts +6 -2
- package/src/ontology/shared-section-props/body-fragments.ts +2 -0
- package/src/ontology/tests/sternsystem-owner.test.ts +1 -1
- package/src/ontology/vitest.config.ts +1 -0
- package/src/{share → page}/page.ts +13 -9
- package/src/{share → page}/tests/dev-props-validator.test.ts +1 -1
- package/src/{share → page}/tests/hero-section-numbering-parity.test.ts +1 -1
- package/src/passport/claim-sign.ts +120 -0
- package/src/passport/index.ts +9 -1
- package/src/passport/key-rotate.ts +10 -2
- package/src/passport/schema.ts +6 -1
- package/src/passport/sign.ts +8 -3
- package/src/passport/vitest.config.ts +1 -0
- package/src/pbt/index.test.ts +95 -0
- package/src/pbt/index.ts +251 -0
- package/src/plugin/plugin-contract.ts +2 -2
- package/src/{share → policy}/entitlement.ts +24 -4
- package/src/{share → policy}/feature-policy.ts +8 -3
- package/src/{share → policy}/visibility.ts +7 -2
- package/src/redirects/redirects.ts +117 -0
- package/src/{share → redirects/tests}/redirects.test.ts +1 -1
- package/src/remediation/remediation-catalog.ts +316 -0
- package/src/{share/routes → routes}/template-filter.ts +1 -1
- package/src/{share → runtime}/runtime-context.ts +7 -2
- package/src/{share → runtime}/shared-context.ts +1 -1
- package/src/{share/schemas → schemas}/claims.ts +2 -2
- package/src/{share/schemas → schemas}/effects.ts +6 -1
- package/src/{share/schemas → schemas}/features.ts +1 -1
- package/src/{share/schemas → schemas}/index.ts +3 -3
- package/src/{share/schemas → schemas}/navigation.ts +6 -1
- package/src/{share/schemas → schemas}/page-base.ts +6 -2
- package/src/{share/schemas → schemas}/person.ts +1 -1
- package/src/{share/schemas → schemas}/standard-list-item.ts +1 -1
- package/src/{share → sections}/rfc0042-utils.ts +1 -1
- package/src/{share/semantic → semantic}/block-extractors/index.ts +20 -1
- package/src/{share/semantic → semantic}/business-projection.ts +95 -1
- package/src/semantic/canonical-uri.ts +74 -0
- package/src/{share/semantic → semantic}/extract.ts +100 -1
- package/src/semantic/fact-extraction.test.ts +47 -0
- package/src/semantic/fact-extraction.ts +46 -0
- package/src/semantic/freshness.ts +67 -0
- package/src/{share/semantic → semantic}/ids.ts +6 -1
- package/src/{share/semantic → semantic}/index.ts +9 -2
- package/src/{share/semantic → semantic}/jsonld/breadcrumb.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/context.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/faq.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/initiative.ts +6 -1
- package/src/{share/semantic → semantic}/jsonld/organization.ts +6 -1
- package/src/{share/semantic → semantic}/jsonld/person.ts +6 -2
- package/src/{share/semantic → semantic}/jsonld/service.ts +6 -2
- package/src/semantic/jsonld/shared.ts +36 -0
- package/src/semantic/jsonld/types.ts +24 -0
- package/src/{share/semantic → semantic}/jsonld/webpage.ts +6 -1
- package/src/semantic/jsonld/website.ts +32 -0
- package/src/{share/semantic → semantic}/jsonld.ts +6 -1
- package/src/{share/semantic → semantic}/llms.ts +51 -5
- package/src/{share/semantic → semantic}/models.ts +26 -38
- package/src/{share/semantic → semantic}/organization-profile.ts +3 -0
- package/src/{share/semantic → semantic}/page-builders/markdown-page.ts +6 -3
- package/src/{share/semantic → semantic}/page-utils.ts +6 -3
- package/src/{share/tests/breadcrumbs.test.ts → semantic/tests/breadcrumbs-0229.test.ts} +1 -1
- package/src/{share → semantic}/tests/build-page-price-markers.test.ts +2 -2
- package/src/{share/semantic → semantic}/tests/business-projection.test.ts +179 -0
- package/src/semantic/tests/canonical-uri.test.ts +68 -0
- package/src/{share/semantic → semantic}/tests/extract.test.ts +83 -0
- package/src/semantic/tests/freshness.pbt.test.ts +108 -0
- package/src/{share/tests/image-sitemap.test.ts → semantic/tests/image-sitemap-0150.test.ts} +1 -1
- package/src/{share → semantic}/tests/jsonld-service.test.ts +2 -2
- package/src/{share → semantic}/tests/jsonld-video.test.ts +3 -3
- package/src/{share → semantic}/tests/jsonld-webpage.test.ts +3 -3
- package/src/{share → semantic}/tests/llms-0789.test.ts +2 -2
- package/src/{share/semantic → semantic}/tests/llms.test.ts +46 -0
- package/src/{share → semantic}/tests/organization-jsonld.test.ts +3 -3
- package/src/{share/tests/output-projection.test.ts → semantic/tests/output-projection-0143.test.ts} +1 -1
- package/src/{share/tests/price-marker-resolver.test.ts → semantic/tests/price-marker-resolver-0767.test.ts} +2 -2
- package/src/{share/semantic → semantic}/tests/price-marker-resolver.test.ts +4 -2
- package/src/semantic/tests/project-claims.pbt.test.ts +60 -0
- package/src/{share/semantic → semantic}/tests/split-sentences.test.ts +1 -1
- package/src/{share → semantic}/tests/twin-path.test.ts +1 -1
- package/src/signing/index.ts +15 -0
- package/src/signing/key.ts +139 -0
- package/src/signing/sign.ts +66 -0
- package/src/signing/types.ts +29 -0
- package/src/{share/slug → slug}/slug-url.ts +4 -1
- package/src/stack/run-tool.ts +106 -0
- package/src/stack/stack-checks.ts +124 -0
- package/src/stack/tests/run-tool.test.ts +138 -0
- package/src/stack/tests/stack-checks.test.ts +141 -0
- package/src/stack/tests/walk-files.test.ts +131 -0
- package/src/stack/walk-files.ts +114 -0
- package/src/surface/blueprint.ts +342 -66
- package/src/surface/decision-composer.ts +6 -1
- package/src/surface/geo.ts +6 -1
- package/src/surface/index.ts +11 -7
- package/src/surface/types.ts +2 -2
- package/src/surface/vitest.config.ts +1 -0
- package/src/tests/signing-core.test.ts +129 -0
- package/src/{share → text}/css-value-normalize.ts +6 -1
- package/src/text/string-utils.ts +24 -0
- package/src/{share → text}/tests/text-normalize.test.ts +5 -0
- package/src/{share → text}/text-normalize.ts +4 -3
- package/src/{share → text}/wrap-inline-numbers.ts +1 -1
- package/src/types/axiom-study.d.ts +36 -0
- package/src/types/hls-js-light.d.ts +21 -0
- package/src/types/qrcode-browser.d.ts +23 -0
- package/src/typography/fix.pbt.test.ts +208 -0
- package/src/typography/fix.ts +148 -0
- package/src/typography/index.ts +54 -0
- package/src/typography/locale-defaults.ts +97 -0
- package/src/typography/rules-tier1.test.ts +459 -0
- package/src/typography/rules-tier1.ts +925 -0
- package/src/typography/rules-tier2-locale.pbt.test.ts +190 -0
- package/src/typography/rules-tier2-locale.test.ts +286 -0
- package/src/typography/rules-tier2-locale.ts +399 -0
- package/src/typography/rules-tier2-structure.test.ts +330 -0
- package/src/typography/rules-tier2-structure.ts +378 -0
- package/src/typography/rules-tier3-advisory.test.ts +290 -0
- package/src/typography/rules-tier3-advisory.ts +239 -0
- package/src/typography/text-surface.test.ts +244 -0
- package/src/typography/text-surface.ts +448 -0
- package/src/index.ts +0 -14
- package/src/integration/port-barrel.ts +0 -105
- package/src/share/agent/tests/api-catalog.test.ts +0 -8
- package/src/share/agent/tests/ard-catalog.test.ts +0 -8
- package/src/share/agent/tests/capability.test.ts +0 -14
- package/src/share/agent/tests/fleet-catalog.test.ts +0 -15
- package/src/share/agent/tests/knowledge.test.ts +0 -20
- package/src/share/agent/tests/manifest.test.ts +0 -9
- package/src/share/agent/tests/mcp-card.test.ts +0 -8
- package/src/share/agent/tests/openapi.test.ts +0 -8
- package/src/share/agent/tests/proof.test.ts +0 -15
- package/src/share/content/index.ts +0 -16
- package/src/share/content-discipline/index.ts +0 -14
- package/src/share/index.ts +0 -86
- package/src/share/knowledge/tests/claim.test.ts +0 -11
- package/src/share/knowledge/tests/derivation.test.ts +0 -30
- package/src/share/knowledge/tests/freshness.test.ts +0 -18
- package/src/share/knowledge/tests/ledger.test.ts +0 -35
- package/src/share/knowledge/tests/plan.test.ts +0 -19
- package/src/share/knowledge/tests/source.test.ts +0 -19
- package/src/share/legal/index.ts +0 -1
- package/src/share/redirects.ts +0 -54
- package/src/share/remediation/remediation-catalog.ts +0 -196
- package/src/share/scripts/index.ts +0 -26
- package/src/share/scripts/tests/orchestrator.test.ts +0 -8
- package/src/share/semantic/jsonld/shared.ts +0 -31
- package/src/share/semantic/jsonld/types.ts +0 -19
- package/src/share/semantic/jsonld/website.ts +0 -27
- package/src/share/string-utils.ts +0 -19
- package/src/share/types/axiom-study.d.ts +0 -22
- package/src/share/types/hls-js-light.d.ts +0 -16
- package/src/share/types/qrcode-browser.d.ts +0 -18
- package/src/share/utility-registry.yaml +0 -50
- package/src/share/vitest.config.ts +0 -8
- package/src/surface/blueprint-schema.ts +0 -314
- package/src/surface/blueprint-types.ts +0 -256
- /package/src/{share/agent → agent}/capability.ts +0 -0
- /package/src/{share/agent → agent}/dns-aid.ts +0 -0
- /package/src/{share/agent → agent}/fleet-catalog.ts +0 -0
- /package/src/{share/agent → agent}/knowledge.ts +0 -0
- /package/src/{share/agent → agent}/mcp-card.ts +0 -0
- /package/src/{share/agent → agent}/omit-empty.ts +0 -0
- /package/src/{share/agent → agent}/proof.ts +0 -0
- /package/src/{share/agent → agent}/tests/omit-empty.test.ts +0 -0
- /package/src/{share → attribution}/attribution-display.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-mountain-journey.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-parallax.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-reveal.ts +0 -0
- /package/src/{share/scripts → client-scripts}/gsap-stagger.ts +0 -0
- /package/src/{share/scripts → client-scripts}/live-photos.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/external-link-qr.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/external-links.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-counter.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-mountain-journey.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-parallax.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-reveal.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/gsap-stagger.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/inline-number-animation.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/lenis.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/live-photos.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/lordicon.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/tests/scheduler.test.ts +0 -0
- /package/src/{share/scripts → client-scripts}/video-player.ts +0 -0
- /package/src/{share/content → content}/resolve-field-path.ts +0 -0
- /package/src/{share/content → content}/substitute-deep.ts +0 -0
- /package/src/{share → content}/tests/content-ref-index.test.ts +0 -0
- /package/src/{share/content-discipline → content-discipline}/types.ts +0 -0
- /package/src/{share → image-provider}/image-provider.ts +0 -0
- /package/src/{share/knowledge → knowledge}/claim.ts +0 -0
- /package/src/{share/knowledge → knowledge}/derivation.ts +0 -0
- /package/src/{share/knowledge → knowledge}/freshness.ts +0 -0
- /package/src/{share/knowledge → knowledge}/index.ts +0 -0
- /package/src/{share/knowledge → knowledge}/ledger.ts +0 -0
- /package/src/{share/knowledge → knowledge}/plan.ts +0 -0
- /package/src/{share/knowledge → knowledge}/source.ts +0 -0
- /package/src/{share/legal → legal}/translation-policy.ts +0 -0
- /package/src/{share/middleware → middleware}/tests/access-protection.test.ts +0 -0
- /package/src/{share → node}/fs/index.ts +0 -0
- /package/src/{share/tests/markdown-twin-provenance.test.ts → node/tests/markdown-twin-provenance-0613.test.ts} +0 -0
- /package/src/{share → offers}/offer-capacity.ts +0 -0
- /package/src/{share/onboarding-yaml/index.ts → onboarding/yaml.ts} +0 -0
- /package/src/{share → ontology}/tests/ontology-role-by-cosmic-name.test.ts +0 -0
- /package/src/{share/routes → routes}/tests/template-filter.test.ts +0 -0
- /package/src/{share/schemas → schemas}/claim-records.ts +0 -0
- /package/src/{share/schemas → schemas}/horizontal-align.ts +0 -0
- /package/src/{share/schemas → schemas}/icon-color.ts +0 -0
- /package/src/{share/schemas → schemas}/live-photo.ts +0 -0
- /package/src/{share/schemas → schemas}/material-credit.ts +0 -0
- /package/src/{share/schemas → schemas}/media.ts +0 -0
- /package/src/{share/schemas → schemas}/participant.ts +0 -0
- /package/src/{share/schemas → schemas}/print.ts +0 -0
- /package/src/{share/schemas → schemas}/section-background.ts +0 -0
- /package/src/{share/schemas → schemas}/section-body.ts +0 -0
- /package/src/{share/schemas → schemas}/section-cards.ts +0 -0
- /package/src/{share/schemas → schemas}/section-cta.ts +0 -0
- /package/src/{share/schemas → schemas}/section-header.ts +0 -0
- /package/src/{share/schemas → schemas}/section-image.ts +0 -0
- /package/src/{share/schemas → schemas}/section-motion.ts +0 -0
- /package/src/{share/schemas → schemas}/section-shell.ts +0 -0
- /package/src/{share/schemas → schemas}/section-stats.ts +0 -0
- /package/src/{share/schemas → schemas}/site-background.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/claim-records.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/claims.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/effects.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/features.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/horizontal-align.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/icon-color.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/live-photo.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/material-credit.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/media.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/navigation.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/page-base.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/participant.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/person.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/print.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-background.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-body.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-cards.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-cta.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-header.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-image.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-motion.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-shell.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/section-stats.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/site-background.test.ts +0 -0
- /package/src/{share/schemas → schemas}/tests/standard-list-item.test.ts +0 -0
- /package/src/{share/semantic → semantic}/ai.ts +0 -0
- /package/src/{share/semantic → semantic}/block-extraction.ts +0 -0
- /package/src/{share/semantic → semantic}/breadcrumbs.ts +0 -0
- /package/src/{share/semantic → semantic}/build-page.ts +0 -0
- /package/src/{share/semantic → semantic}/feed.ts +0 -0
- /package/src/{share/semantic → semantic}/image-sitemap.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/article.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/collection-list.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/article.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/breadcrumb.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/collection-list.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/faq.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/initiative.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/organization.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/person.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/service.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/shared.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/video.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/webpage.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/tests/website.test.ts +0 -0
- /package/src/{share/semantic → semantic}/jsonld/video.ts +0 -0
- /package/src/{share/semantic → semantic}/llms-policy.ts +0 -0
- /package/src/{share/semantic → semantic}/markdown-hygiene.ts +0 -0
- /package/src/{share/semantic → semantic}/output-projection.ts +0 -0
- /package/src/{share/semantic → semantic}/page-markdown.ts +0 -0
- /package/src/{share/semantic → semantic}/price-marker-resolver.ts +0 -0
- /package/src/{share/semantic → semantic}/robots.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/ai.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/block-extraction.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/breadcrumbs.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/build-page.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/feed.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/helpers.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/ids.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/image-sitemap.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/jsonld.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/llms-policy.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/markdown-hygiene.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/markdown-page.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/organization-profile.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/output-projection.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/page-markdown.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/page-utils.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/robots.test.ts +0 -0
- /package/src/{share/semantic → semantic}/tests/update-stamp.test.ts +0 -0
- /package/src/{share/semantic → semantic}/update-stamp.ts +0 -0
- /package/src/{share/slug → slug}/heading-slugger.ts +0 -0
- /package/src/{share/slug → slug}/index.ts +0 -0
- /package/src/{share/slug → slug}/slug-id.ts +0 -0
- /package/src/{share/slug → slug}/strategies.ts +0 -0
- /package/src/{share/slug → slug}/tests/slug.test.ts +0 -0
- /package/src/{share → text}/tests/text-normalize.pbt.test.ts +0 -0
- /package/src/{share → text}/text-position.ts +0 -0
|
@@ -6,9 +6,13 @@
|
|
|
6
6
|
</non-goals>
|
|
7
7
|
</MODULE_CONTRACT>
|
|
8
8
|
<CHANGE_SUMMARY>
|
|
9
|
-
<item>Added Service JSON-LD generation.</item>
|
|
10
|
-
<item>Moved from app semantic/jsonld/service to packages/share.</item>
|
|
11
9
|
<item>RFC-0498: extend buildServiceNodes to gate Service emission by per-depth policy for all surface depths (website-local depth-1, website-service depth-1, website-local depth-5).</item>
|
|
10
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
11
|
+
|
|
12
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
13
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
14
|
+
|
|
15
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
12
16
|
</CHANGE_SUMMARY>
|
|
13
17
|
*/
|
|
14
18
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>Maintains packages/share/src/semantic/jsonld/shared.ts as an authored share authored module so agents can evolve it without rediscovering local boundaries.</purpose>
|
|
4
|
+
<non-goals>
|
|
5
|
+
<item>Do not modify node structure.</item>
|
|
6
|
+
</non-goals>
|
|
7
|
+
</MODULE_CONTRACT>
|
|
8
|
+
<CHANGE_SUMMARY>
|
|
9
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
10
|
+
|
|
11
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
12
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
13
|
+
|
|
14
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
15
|
+
</CHANGE_SUMMARY>
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { JsonLdNode } from "./types.ts";
|
|
19
|
+
|
|
20
|
+
export function dedupeGraph(nodes: JsonLdNode[]): JsonLdNode[] {
|
|
21
|
+
const seenIds = new Set<string>();
|
|
22
|
+
|
|
23
|
+
return nodes.filter((node) => {
|
|
24
|
+
const nodeId = typeof node["@id"] === "string" ? node["@id"] : null;
|
|
25
|
+
if (!nodeId) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if (seenIds.has(nodeId)) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
seenIds.add(nodeId);
|
|
34
|
+
return true;
|
|
35
|
+
});
|
|
36
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// test-adjacency: exempt — pure type definitions
|
|
2
|
+
/*
|
|
3
|
+
<MODULE_CONTRACT>
|
|
4
|
+
<purpose>Maintains packages/share/src/semantic/jsonld/types.ts as an authored share authored module so agents can evolve it without rediscovering local boundaries.</purpose>
|
|
5
|
+
<non-goals>
|
|
6
|
+
<item>Do not implement JSON-LD processing logic.</item>
|
|
7
|
+
</non-goals>
|
|
8
|
+
</MODULE_CONTRACT>
|
|
9
|
+
<CHANGE_SUMMARY>
|
|
10
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
11
|
+
|
|
12
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
13
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
14
|
+
|
|
15
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
16
|
+
</CHANGE_SUMMARY>
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
export type JsonLdNode = Record<string, unknown>;
|
|
20
|
+
|
|
21
|
+
export type JsonLdDocument = {
|
|
22
|
+
"@context": "https://schema.org";
|
|
23
|
+
"@graph": JsonLdNode[];
|
|
24
|
+
};
|
|
@@ -6,8 +6,13 @@
|
|
|
6
6
|
</non-goals>
|
|
7
7
|
</MODULE_CONTRACT>
|
|
8
8
|
<CHANGE_SUMMARY>
|
|
9
|
-
<item>Added type expansion for donate/faq/news page variants.</item>
|
|
10
9
|
<item>RFC-0372: speakable reads from unified page.blocks instead of answerBlocks.</item>
|
|
10
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
11
|
+
|
|
12
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
13
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
14
|
+
|
|
15
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
11
16
|
</CHANGE_SUMMARY>
|
|
12
17
|
*/
|
|
13
18
|
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/*
|
|
2
|
+
<MODULE_CONTRACT>
|
|
3
|
+
<purpose>Maintains packages/share/src/semantic/jsonld/website.ts as an authored share authored module so agents can evolve it without rediscovering local boundaries.</purpose>
|
|
4
|
+
<non-goals>
|
|
5
|
+
<item>Do not parse raw content.</item>
|
|
6
|
+
</non-goals>
|
|
7
|
+
</MODULE_CONTRACT>
|
|
8
|
+
<CHANGE_SUMMARY>
|
|
9
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
10
|
+
|
|
11
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
12
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
13
|
+
|
|
14
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
15
|
+
</CHANGE_SUMMARY>
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { JsonLdContext } from "./context.ts";
|
|
19
|
+
import type { JsonLdNode } from "./types.ts";
|
|
20
|
+
|
|
21
|
+
export function buildWebSiteNode(context: JsonLdContext): JsonLdNode {
|
|
22
|
+
const { page, ids } = context;
|
|
23
|
+
|
|
24
|
+
return {
|
|
25
|
+
"@type": "WebSite",
|
|
26
|
+
"@id": ids.website,
|
|
27
|
+
url: page.organization.url,
|
|
28
|
+
name: page.organization.name,
|
|
29
|
+
inLanguage: page.lang,
|
|
30
|
+
publisher: { "@id": ids.organization },
|
|
31
|
+
};
|
|
32
|
+
}
|
|
@@ -7,8 +7,13 @@
|
|
|
7
7
|
</non-goals>
|
|
8
8
|
</MODULE_CONTRACT>
|
|
9
9
|
<CHANGE_SUMMARY>
|
|
10
|
-
<item>Added initiative list graph node, breadcrumb fallback, and shared dedupe utility.</item>
|
|
11
10
|
<item>RFC-0912: added VideoObject node composition for opted-in content video blocks.</item>
|
|
11
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
12
|
+
|
|
13
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
14
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
15
|
+
|
|
16
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
12
17
|
</CHANGE_SUMMARY>
|
|
13
18
|
*/
|
|
14
19
|
|
|
@@ -7,9 +7,16 @@
|
|
|
7
7
|
</non-goals>
|
|
8
8
|
</MODULE_CONTRACT>
|
|
9
9
|
<CHANGE_SUMMARY>
|
|
10
|
-
<item>Added full llms.txt generation and optional title-aware page labels.</item>
|
|
11
|
-
<item>RFC-0184: canonical Markdown links, blockquoted summary, absolute URLs, llms-full.txt reference, and empty-section filtering.</item>
|
|
12
10
|
<item>RFC-0372: formatBlocks reads from unified page.blocks instead of answerBlocks + contentBlocks.</item>
|
|
11
|
+
<item>RFC-1075: emit canonicalUri for organization and offer in llms-full.txt.</item>
|
|
12
|
+
<item>RFC-1076: add formatClaims section in buildLlmsFull for claim provenance.</item>
|
|
13
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
14
|
+
|
|
15
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
16
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
17
|
+
|
|
18
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
19
|
+
<history>RFC-0184</history>
|
|
13
20
|
</CHANGE_SUMMARY>
|
|
14
21
|
*/
|
|
15
22
|
|
|
@@ -119,6 +126,9 @@ function formatInitiatives(page: SemanticPageModel): string {
|
|
|
119
126
|
|
|
120
127
|
function formatOrganizationFacts(site: SemanticSiteModel): string[] {
|
|
121
128
|
return [
|
|
129
|
+
...(site.organization.canonicalUri
|
|
130
|
+
? [`- Canonical URI: ${site.organization.canonicalUri}`]
|
|
131
|
+
: []),
|
|
122
132
|
`- Name: ${site.organization.legalName ?? site.organization.name}`,
|
|
123
133
|
...(site.organization.foundingYear ? [`- Founded: ${site.organization.foundingYear}`] : []),
|
|
124
134
|
...(site.organization.registration
|
|
@@ -182,7 +192,8 @@ function formatOffer(site: SemanticSiteModel): string[] {
|
|
|
182
192
|
const offer = site.organization.offer;
|
|
183
193
|
if (
|
|
184
194
|
!offer ||
|
|
185
|
-
(!offer.
|
|
195
|
+
(!offer.canonicalUri &&
|
|
196
|
+
!offer.prices?.length &&
|
|
186
197
|
!offer.guarantees?.length &&
|
|
187
198
|
!offer.growthModules?.length &&
|
|
188
199
|
!offer.changePrice &&
|
|
@@ -192,6 +203,9 @@ function formatOffer(site: SemanticSiteModel): string[] {
|
|
|
192
203
|
return [];
|
|
193
204
|
}
|
|
194
205
|
const lines: string[] = ["## Offer"];
|
|
206
|
+
if (offer.canonicalUri) {
|
|
207
|
+
lines.push(`- Canonical URI: ${offer.canonicalUri}`);
|
|
208
|
+
}
|
|
195
209
|
if (offer.prices?.length) {
|
|
196
210
|
lines.push(...offer.prices.map((price) => `- ${price.label}: ${price.amount}`));
|
|
197
211
|
}
|
|
@@ -281,6 +295,29 @@ function formatTeam(site: SemanticSiteModel): string[] {
|
|
|
281
295
|
return lines;
|
|
282
296
|
}
|
|
283
297
|
|
|
298
|
+
/** RFC-1076: render projected claims with their evidence references. */
|
|
299
|
+
function formatClaims(site: SemanticSiteModel): string[] {
|
|
300
|
+
if (!site.claims?.length) return [];
|
|
301
|
+
const lines: string[] = ["## Claims"];
|
|
302
|
+
for (const claim of site.claims) {
|
|
303
|
+
lines.push(`### ${claim.statement}`);
|
|
304
|
+
lines.push(`- Class: ${claim.claimClass}`);
|
|
305
|
+
if (claim.verificationLevel) lines.push(`- Verification: ${claim.verificationLevel}`);
|
|
306
|
+
if (claim.confidence) lines.push(`- Confidence: ${claim.confidence}`);
|
|
307
|
+
if (claim.evidence.length > 0) {
|
|
308
|
+
lines.push("- Evidence:");
|
|
309
|
+
for (const ref of claim.evidence) {
|
|
310
|
+
const sha = ref.sha256 ? ` — sha256: ${ref.sha256}` : "";
|
|
311
|
+
lines.push(` - ${ref.kind}: ${ref.label}${sha}`);
|
|
312
|
+
}
|
|
313
|
+
} else {
|
|
314
|
+
lines.push("- Evidence: none");
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
lines.push("");
|
|
318
|
+
return lines;
|
|
319
|
+
}
|
|
320
|
+
|
|
284
321
|
function toAbsoluteUrl(site: SemanticSiteModel, pathname: string): string {
|
|
285
322
|
const rawBase = site.organization.url ?? site.baseUrl;
|
|
286
323
|
const base = (() => {
|
|
@@ -309,18 +346,26 @@ function formatMarkdownLinkRow(site: SemanticSiteModel, page: SemanticPageModel)
|
|
|
309
346
|
return `- [${title}](${url}): ${summary}`;
|
|
310
347
|
}
|
|
311
348
|
|
|
312
|
-
export function buildLlmsIndex(site: SemanticSiteModel): string {
|
|
349
|
+
export function buildLlmsIndex(site: SemanticSiteModel, opts?: { servesSsr?: boolean }): string {
|
|
313
350
|
const indexPages = site.pages.filter(inIndex);
|
|
314
351
|
const llmsFullUrl = canonicalStaticUrl("/llms-full.txt", { baseUrl: site.baseUrl });
|
|
315
352
|
const siteDescription = site.organization.description ?? "";
|
|
316
353
|
|
|
317
354
|
// RFC-0789: agent discovery links — omitted when agent.enabled is false.
|
|
355
|
+
// The MCP Server Card exists only when the deployment adapter serves SSR
|
|
356
|
+
// routes (interfaces.mcp is set) — callers pass servesSsr=false on static
|
|
357
|
+
// adapters so the card is not advertised (PUBTXT-07 honesty).
|
|
318
358
|
const agentEnabled = site.agent?.enabled !== false;
|
|
359
|
+
const servesSsr = opts?.servesSsr !== false;
|
|
319
360
|
const agentLinks = agentEnabled
|
|
320
361
|
? [
|
|
321
362
|
`> Machine-readable Agent Surface (structured knowledge + capabilities): [agent.json](${canonicalStaticUrl("/.well-known/agent.json", { baseUrl: site.baseUrl })}).`,
|
|
322
363
|
`> API discovery catalog (RFC 9727): [api-catalog](${canonicalStaticUrl("/.well-known/api-catalog", { baseUrl: site.baseUrl })}).`,
|
|
323
|
-
|
|
364
|
+
...(servesSsr
|
|
365
|
+
? [
|
|
366
|
+
`> MCP Server Card (SEP-1649): [server-card.json](${canonicalStaticUrl("/.well-known/mcp/server-card.json", { baseUrl: site.baseUrl })}).`,
|
|
367
|
+
]
|
|
368
|
+
: []),
|
|
324
369
|
`> OpenAPI 3.1 specification: [agent.openapi.json](${canonicalStaticUrl("/.well-known/agent.openapi.json", { baseUrl: site.baseUrl })}).`,
|
|
325
370
|
]
|
|
326
371
|
: [];
|
|
@@ -380,6 +425,7 @@ export function buildLlmsFull(site: SemanticSiteModel): string {
|
|
|
380
425
|
...formatServices(site),
|
|
381
426
|
...formatLocation(site),
|
|
382
427
|
...formatTeam(site),
|
|
428
|
+
...formatClaims(site),
|
|
383
429
|
].filter((s) => s.length > 0);
|
|
384
430
|
|
|
385
431
|
return [
|
|
@@ -7,49 +7,31 @@
|
|
|
7
7
|
</non-goals>
|
|
8
8
|
</MODULE_CONTRACT>
|
|
9
9
|
<CHANGE_SUMMARY>
|
|
10
|
-
<item>RFC-0133: backfilled MODULE_MAP and CHANGE_SUMMARY markers for compass.validate compliance.</item>
|
|
11
|
-
<item>RFC-0165/0167: SemanticImage.contentImage flag + PageOutputProjection.image (author-declared per-page content illustration, single source for image:image + top-precedence og:image).</item>
|
|
12
|
-
<item>RFC-0328: Added "legal" to the SemanticPageType closed enum.</item>
|
|
13
|
-
<item>RFC-0490: Added "collection" to the SemanticPageType closed enum.</item>
|
|
14
|
-
<item>RFC-0508: Added "participant" to the SemanticPageType closed enum.</item>
|
|
15
10
|
<item>RFC-0372: Unified SemanticBlock type replaces SemanticAnswerBlock + SemanticContentBlock; SemanticPageModel.blocks replaces answerBlocks/contentBlocks/bodyText.</item>
|
|
16
11
|
<item>RFC-0912: Added VideoSeoData type and optional SemanticBlock.video field for opted-in content video structured data.</item>
|
|
12
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
13
|
+
|
|
14
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
15
|
+
<item>RFC-1097: sweep — tail packages clean
|
|
16
|
+
|
|
17
|
+
Sweep batch 3: rewrote ~95 purposes across werkstatt-knowledge, werkstatt-shared, godot-game, phaser-game, lifecycle-core, projektarchiv-*, portal-*, billing-*, typescript (CONTRACT-02/PURPOSE-02). Real KEY_DECISIONS on 5 godot utils, non-goals on 5 CONTRACT-03 files, headers on 4 headerless files, CS-07 history literal fix on 2 files. Policy: vitest.config.ts + test-fixtures testPatterns, worker-configuration.d.ts excludedPath. All non-site/engine packages now 0 diagnostics.</item>
|
|
18
|
+
<item>RFC-1106: step 4 — single-source SemanticPageType
|
|
19
|
+
|
|
20
|
+
semanticPageTypeSchema (ontology/schemas/system/page-output.ts) is now the sole declaration of the closed DNA-19 vocabulary. semantic/models.ts derives the type via z.infer and SEMANTIC_PAGE_TYPES via schema.options — the hand-synced union/array and stale circular-dependency comments are deleted.</item>
|
|
21
|
+
<history>RFC-0133, RFC-0165, RFC-0328, RFC-0490, RFC-0508</history>
|
|
17
22
|
</CHANGE_SUMMARY>
|
|
18
23
|
*/
|
|
19
24
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
//
|
|
24
|
-
//
|
|
25
|
-
//
|
|
26
|
-
export type SemanticPageType =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
| "donationContact"
|
|
31
|
-
| "openSource"
|
|
32
|
-
| "content"
|
|
33
|
-
| "article"
|
|
34
|
-
| "person"
|
|
35
|
-
| "participant"
|
|
36
|
-
| "legal"
|
|
37
|
-
| "collection";
|
|
38
|
-
|
|
39
|
-
/** Runtime counterpart to the `SemanticPageType` closed union. Keep in sync manually. */
|
|
40
|
-
export const SEMANTIC_PAGE_TYPES: readonly SemanticPageType[] = [
|
|
41
|
-
"home",
|
|
42
|
-
"about",
|
|
43
|
-
"projects",
|
|
44
|
-
"donationContact",
|
|
45
|
-
"openSource",
|
|
46
|
-
"content",
|
|
47
|
-
"article",
|
|
48
|
-
"person",
|
|
49
|
-
"participant",
|
|
50
|
-
"legal",
|
|
51
|
-
"collection",
|
|
52
|
-
];
|
|
25
|
+
import { z } from "zod";
|
|
26
|
+
import { semanticPageTypeSchema } from "../ontology/schemas/system/page-output.ts";
|
|
27
|
+
|
|
28
|
+
// RFC-1106: semanticPageTypeSchema (ontology/schemas/system/page-output.ts) is
|
|
29
|
+
// the sole declaration of this closed DNA-19 vocabulary. The type and the
|
|
30
|
+
// runtime array derive from it — no hand-synced mirror.
|
|
31
|
+
export type SemanticPageType = z.infer<typeof semanticPageTypeSchema>;
|
|
32
|
+
|
|
33
|
+
/** Runtime list of the closed vocabulary — derived from the schema's options. */
|
|
34
|
+
export const SEMANTIC_PAGE_TYPES: readonly SemanticPageType[] = semanticPageTypeSchema.options;
|
|
53
35
|
|
|
54
36
|
export type SemanticBreadcrumb = {
|
|
55
37
|
name: string;
|
|
@@ -236,6 +218,8 @@ export type SemanticOfferCapacity = {
|
|
|
236
218
|
};
|
|
237
219
|
|
|
238
220
|
export type SemanticOffer = {
|
|
221
|
+
/** RFC-1075: persistent canonical URI for Linked Data @id. */
|
|
222
|
+
canonicalUri?: string;
|
|
239
223
|
prices?: SemanticPrice[];
|
|
240
224
|
guarantees?: SemanticGuarantee[];
|
|
241
225
|
growthModules?: SemanticGrowthModule[];
|
|
@@ -269,6 +253,8 @@ export type SemanticFaqEntry = {
|
|
|
269
253
|
};
|
|
270
254
|
|
|
271
255
|
export type SemanticOrganization = {
|
|
256
|
+
/** RFC-1075: persistent canonical URI for Linked Data @id. */
|
|
257
|
+
canonicalUri?: string;
|
|
272
258
|
name: string;
|
|
273
259
|
legalName?: string;
|
|
274
260
|
description: string;
|
|
@@ -417,4 +403,6 @@ export type SemanticSiteModel = {
|
|
|
417
403
|
pages: SemanticPageModel[];
|
|
418
404
|
/** RFC-0789: agent block from system.md, populated by the semantic loader. */
|
|
419
405
|
agent?: { enabled?: boolean };
|
|
406
|
+
/** RFC-1076: projected claims with evidence provenance, loaded by the semantic loader. */
|
|
407
|
+
claims?: import("./business-projection.ts").SemanticClaimProvenance[];
|
|
420
408
|
};
|
|
@@ -9,10 +9,12 @@
|
|
|
9
9
|
<CHANGE_SUMMARY>
|
|
10
10
|
<item>RFC-0148: extracted the shared org-profile assembler from the disk + Astro builders.</item>
|
|
11
11
|
<item>RFC-0910: Organization.url uses canonicalRootUrl (unprefixed root) instead of language-prefixed path.</item>
|
|
12
|
+
<item>RFC-1075: populate canonicalUri on SemanticOrganization using deriveCanonicalUri.</item>
|
|
12
13
|
</CHANGE_SUMMARY>
|
|
13
14
|
*/
|
|
14
15
|
|
|
15
16
|
import { canonicalRootUrl, getBaseUrl, toAbsoluteUrl } from "./ids.ts";
|
|
17
|
+
import { deriveCanonicalUri } from "./canonical-uri.ts";
|
|
16
18
|
import type {
|
|
17
19
|
SemanticInitiative,
|
|
18
20
|
SemanticLocation,
|
|
@@ -106,6 +108,7 @@ export function buildOrganizationProfile(input: OrganizationProfileInput): Seman
|
|
|
106
108
|
legalName: input.legalName,
|
|
107
109
|
description: input.description,
|
|
108
110
|
url: canonicalRootUrl(baseUrl),
|
|
111
|
+
...({ canonicalUri: deriveCanonicalUri(baseUrl, "business") } as { canonicalUri?: string }),
|
|
109
112
|
foundingYear: input.foundingYear,
|
|
110
113
|
email: input.email,
|
|
111
114
|
registration: input.registration,
|
|
@@ -7,10 +7,13 @@
|
|
|
7
7
|
</non-goals>
|
|
8
8
|
</MODULE_CONTRACT>
|
|
9
9
|
<CHANGE_SUMMARY>
|
|
10
|
-
<item>Consolidated 7 copy-paste page builders (impressum, datenschutz, agb, widerruf, open-source, projekte, wir-ueber-uns) into one generic function.</item>
|
|
11
|
-
<item>Introduced app-agnostic markdown-page semantic builder and breadcrumb normalization.</item>
|
|
12
|
-
<item>Unified blocksToMarkdown signature — eliminated duplication.</item>
|
|
13
10
|
<item>RFC-0372: MarkdownPageInput now accepts blocks: SemanticBlock[] directly; removed bodyText/contentBlocks/answerBlocks from input and output.</item>
|
|
11
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
12
|
+
|
|
13
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
14
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
15
|
+
|
|
16
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
14
17
|
</CHANGE_SUMMARY>
|
|
15
18
|
*/
|
|
16
19
|
|
|
@@ -7,11 +7,14 @@
|
|
|
7
7
|
</non-goals>
|
|
8
8
|
</MODULE_CONTRACT>
|
|
9
9
|
<CHANGE_SUMMARY>
|
|
10
|
-
<item>Extracted from app semantic pages _shared — framework-agnostic utilities moved to packages/share.</item>
|
|
11
|
-
<item>Unified single blocksToMarkdown signature (was duplicated with different signatures in app).</item>
|
|
12
|
-
<item>Added slugify export and markdown answer-block extraction utilities.</item>
|
|
13
10
|
<item>RFC-0372: toSemanticAnswerBlocks now returns SemanticBlock[] with blockType: "prose".</item>
|
|
14
11
|
<item>RFC-0915: replaced slugify import from extract.ts with slugId from canonical slug module.</item>
|
|
12
|
+
<item>RFC-1097: step 6 — compass.migrate codemod run
|
|
13
|
+
|
|
14
|
+
Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
|
|
15
|
+
<item>RFC-1097: sweep — werkstatt-engine clean
|
|
16
|
+
|
|
17
|
+
Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
|
|
15
18
|
</CHANGE_SUMMARY>
|
|
16
19
|
*/
|
|
17
20
|
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
surfaceAncestorPageIds,
|
|
15
15
|
type BreadcrumbAncestorResolver,
|
|
16
16
|
type BreadcrumbCrumb,
|
|
17
|
-
} from "../
|
|
17
|
+
} from "../breadcrumbs.ts";
|
|
18
18
|
|
|
19
19
|
const HOME = "https://example.com/";
|
|
20
20
|
const SELF = "https://example.com/website/schreiner/muenchen/";
|
|
@@ -10,8 +10,8 @@ import {
|
|
|
10
10
|
buildSemanticPageModelWith,
|
|
11
11
|
type SemanticContentReader,
|
|
12
12
|
type SemanticBuildProfile,
|
|
13
|
-
} from "../
|
|
14
|
-
import { OFFERING_URI_PREFIX, type DerivedPriceEntry } from "../
|
|
13
|
+
} from "../build-page.ts";
|
|
14
|
+
import { OFFERING_URI_PREFIX, type DerivedPriceEntry } from "../price-marker-resolver.ts";
|
|
15
15
|
|
|
16
16
|
const fixturePrices: Record<string, DerivedPriceEntry[]> = {
|
|
17
17
|
[`${OFFERING_URI_PREFIX}referral-fee`]: [
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
projectPeople,
|
|
7
7
|
projectServices,
|
|
8
8
|
projectWeb,
|
|
9
|
+
projectClaims,
|
|
9
10
|
} from "../business-projection.ts";
|
|
10
11
|
|
|
11
12
|
describe("BUSINESS_DOMAIN_VISIBILITY", () => {
|
|
@@ -186,3 +187,181 @@ describe("projectWeb", () => {
|
|
|
186
187
|
expect(projectWeb({})).toBeUndefined();
|
|
187
188
|
});
|
|
188
189
|
});
|
|
190
|
+
|
|
191
|
+
describe("projectClaims", () => {
|
|
192
|
+
it("returns empty array for undefined claims", () => {
|
|
193
|
+
expect(projectClaims(undefined, undefined)).toEqual([]);
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it("returns empty array for empty claims", () => {
|
|
197
|
+
expect(projectClaims([], undefined)).toEqual([]);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it("filters out non-published claims", () => {
|
|
201
|
+
const claims = [
|
|
202
|
+
{
|
|
203
|
+
id: "c1",
|
|
204
|
+
status: "draft",
|
|
205
|
+
statement: "Draft claim",
|
|
206
|
+
claimClass: "factual",
|
|
207
|
+
claimKind: "fact",
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
id: "c2",
|
|
211
|
+
status: "published",
|
|
212
|
+
statement: "Published claim",
|
|
213
|
+
claimClass: "factual",
|
|
214
|
+
claimKind: "fact",
|
|
215
|
+
},
|
|
216
|
+
];
|
|
217
|
+
const result = projectClaims(claims, undefined);
|
|
218
|
+
expect(result).toHaveLength(1);
|
|
219
|
+
expect(result[0].id).toBe("c2");
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it("skips claims without an id", () => {
|
|
223
|
+
const claims = [
|
|
224
|
+
{ status: "published", statement: "No ID", claimClass: "factual", claimKind: "fact" },
|
|
225
|
+
];
|
|
226
|
+
expect(projectClaims(claims, undefined)).toEqual([]);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it("projects claim fields", () => {
|
|
230
|
+
const claims = [
|
|
231
|
+
{
|
|
232
|
+
id: "c1",
|
|
233
|
+
status: "published",
|
|
234
|
+
statement: "We are awesome",
|
|
235
|
+
claimClass: "benefit",
|
|
236
|
+
claimKind: "benefit",
|
|
237
|
+
statementLang: "en",
|
|
238
|
+
verificationLevel: "N2",
|
|
239
|
+
confidence: "high",
|
|
240
|
+
},
|
|
241
|
+
];
|
|
242
|
+
const result = projectClaims(claims, undefined);
|
|
243
|
+
expect(result[0]).toEqual({
|
|
244
|
+
id: "c1",
|
|
245
|
+
claimClass: "benefit",
|
|
246
|
+
claimKind: "benefit",
|
|
247
|
+
statement: "We are awesome",
|
|
248
|
+
statementLang: "en",
|
|
249
|
+
verificationLevel: "N2",
|
|
250
|
+
confidence: "high",
|
|
251
|
+
evidence: [],
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
|
|
255
|
+
it("resolves evidence refs using the ref field", () => {
|
|
256
|
+
const claims = [
|
|
257
|
+
{
|
|
258
|
+
id: "c1",
|
|
259
|
+
status: "published",
|
|
260
|
+
statement: "Claim with evidence",
|
|
261
|
+
claimClass: "factual",
|
|
262
|
+
claimKind: "fact",
|
|
263
|
+
evidenceRefs: { ev1: { ref: "evidence-1" } },
|
|
264
|
+
},
|
|
265
|
+
];
|
|
266
|
+
const evidenceSources = {
|
|
267
|
+
"evidence-1": {
|
|
268
|
+
id: "evidence-1",
|
|
269
|
+
kind: "verified-record",
|
|
270
|
+
name: "Audit Report",
|
|
271
|
+
items: { item1: { sha256: "abc123", canonical: true } },
|
|
272
|
+
canonicalUri: "https://example.com/evidence/1",
|
|
273
|
+
},
|
|
274
|
+
};
|
|
275
|
+
const result = projectClaims(claims, evidenceSources);
|
|
276
|
+
expect(result[0].evidence).toHaveLength(1);
|
|
277
|
+
expect(result[0].evidence[0]).toEqual({
|
|
278
|
+
id: "evidence-1",
|
|
279
|
+
kind: "verified-record",
|
|
280
|
+
label: "Audit Report",
|
|
281
|
+
sha256: "abc123",
|
|
282
|
+
canonicalUri: "https://example.com/evidence/1",
|
|
283
|
+
});
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
it("falls back to first item when no canonical item exists", () => {
|
|
287
|
+
const claims = [
|
|
288
|
+
{
|
|
289
|
+
id: "c1",
|
|
290
|
+
status: "published",
|
|
291
|
+
statement: "Claim",
|
|
292
|
+
claimClass: "factual",
|
|
293
|
+
claimKind: "fact",
|
|
294
|
+
evidenceRefs: { ev1: { ref: "evidence-1" } },
|
|
295
|
+
},
|
|
296
|
+
];
|
|
297
|
+
const evidenceSources = {
|
|
298
|
+
"evidence-1": {
|
|
299
|
+
id: "evidence-1",
|
|
300
|
+
kind: "certificate",
|
|
301
|
+
name: "ISO Certificate",
|
|
302
|
+
items: {
|
|
303
|
+
item1: { sha256: "first-hash" },
|
|
304
|
+
item2: { sha256: "second-hash", canonical: true },
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
const result = projectClaims(claims, evidenceSources);
|
|
309
|
+
expect(result[0].evidence[0].sha256).toBe("second-hash");
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
it("uses first item when no canonical flag at all", () => {
|
|
313
|
+
const claims = [
|
|
314
|
+
{
|
|
315
|
+
id: "c1",
|
|
316
|
+
status: "published",
|
|
317
|
+
statement: "Claim",
|
|
318
|
+
claimClass: "factual",
|
|
319
|
+
claimKind: "fact",
|
|
320
|
+
evidenceRefs: { ev1: { ref: "evidence-1" } },
|
|
321
|
+
},
|
|
322
|
+
];
|
|
323
|
+
const evidenceSources = {
|
|
324
|
+
"evidence-1": {
|
|
325
|
+
id: "evidence-1",
|
|
326
|
+
kind: "certificate",
|
|
327
|
+
name: "ISO Certificate",
|
|
328
|
+
items: { item1: { sha256: "only-hash" } },
|
|
329
|
+
},
|
|
330
|
+
};
|
|
331
|
+
const result = projectClaims(claims, evidenceSources);
|
|
332
|
+
expect(result[0].evidence[0].sha256).toBe("only-hash");
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
it("skips evidence refs that point to missing sources", () => {
|
|
336
|
+
const claims = [
|
|
337
|
+
{
|
|
338
|
+
id: "c1",
|
|
339
|
+
status: "published",
|
|
340
|
+
statement: "Claim",
|
|
341
|
+
claimClass: "factual",
|
|
342
|
+
claimKind: "fact",
|
|
343
|
+
evidenceRefs: { ev1: { ref: "missing" } },
|
|
344
|
+
},
|
|
345
|
+
];
|
|
346
|
+
const result = projectClaims(claims, undefined);
|
|
347
|
+
expect(result[0].evidence).toEqual([]);
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it("uses sourceId as label when name is missing", () => {
|
|
351
|
+
const claims = [
|
|
352
|
+
{
|
|
353
|
+
id: "c1",
|
|
354
|
+
status: "published",
|
|
355
|
+
statement: "Claim",
|
|
356
|
+
claimClass: "factual",
|
|
357
|
+
claimKind: "fact",
|
|
358
|
+
evidenceRefs: { ev1: { ref: "evidence-1" } },
|
|
359
|
+
},
|
|
360
|
+
];
|
|
361
|
+
const evidenceSources = {
|
|
362
|
+
"evidence-1": { id: "evidence-1", kind: "registry" },
|
|
363
|
+
};
|
|
364
|
+
const result = projectClaims(claims, evidenceSources);
|
|
365
|
+
expect(result[0].evidence[0].label).toBe("evidence-1");
|
|
366
|
+
});
|
|
367
|
+
});
|