survos / claims-bundle
Store machine, human, and source assertions as append-only claims with confidence, basis, and provenance.
Fund package maintenance!
Requires
- php: ^8.4
- doctrine/dbal: ^3.9||^4.2
- doctrine/doctrine-bundle: ^3.2
- doctrine/orm: ^3.6
- survos/data-contracts: ^2.5
- survos/field-bundle: ^2.5
- survos/jsonl-bundle: ^2.5
- symfony/console: ^8.0
- symfony/framework-bundle: ^8.0
- symfony/uid: ^8.0
Requires (Dev)
- api-platform/core: ^4.0
- phpunit/phpunit: ^13.0
Suggests
- api-platform/core: Exposes Claim as an ApiResource with schema + concrete examples.
- dev-main
- 2.7.18
- 2.7.17
- 2.7.16
- 2.7.15
- 2.7.14
- 2.7.13
- 2.7.12
- 2.7.11
- 2.7.10
- 2.7.9
- 2.7.8
- 2.7.7
- 2.7.6
- 2.7.5
- 2.7.4
- 2.7.3
- 2.7.2
- 2.7.1
- 2.7.0
- 2.6.0
- 2.5.8
- 2.5.7
- 2.5.6
- 2.5.5
- 2.5.3
- 2.5.2
- 2.5.1
- 2.5.0
- 2.4.4
- 2.4.3
- 2.4.2
- 2.4.1
- 2.4.0
- 2.3.0
- 2.2.5
- 2.2.4
- 2.2.3
- 2.2.2
- 2.2.1
- 2.2.0
- 2.1.2
- 2.1.1
- 2.0.220
- 2.0.219
- 2.0.218
- 2.0.217
- 2.0.216
- 2.0.215
- 2.0.214
- 2.0.213
- 2.0.212
- 2.0.211
- 2.0.210
- 2.0.209
- 2.0.208
- 2.0.207
- 2.0.206
- 2.0.205
- 2.0.204
- 2.0
This package is auto-updated.
Last update: 2026-06-06 20:36:10 UTC
README
Store machine, human, and source assertions as append-only claims with
confidence, basis, and source.
Generated metadata is an assertion, not a fact. Recording it as a structured claim lets you:
- know how confident the tool was (the
confidencefloat) - know why the tool asserted it (the
basistext) - know which tool produced it, at what version (the
sourcestring) - accumulate multiple claims about the same thing and aggregate into a best-guess view — humans can later promote or reject individual claims
- export to and import from JSONL for cheap round-trip backup
The bundle is vocab-agnostic (no predicate enum), storage-layer-only
(no inference, no LLM calls), and tenant-agnostic (a nullable scope
string that the consumer partitions on).
Install
composer require survos/claims-bundle
The bundle is a flex-compatible Symfony bundle and auto-registers in
config/bundles.php, and the bundle prepends its Doctrine ORM mapping
automatically, like the other Survos bundles.
Register list-valued predicates so the aggregator projects them correctly:
# config/packages/survos_claims.yaml survos_claims: list_predicates: - dcterms:subject # keywords - dcterms:spatial # places - foaf:Person
Generate the migration (or run doctrine:schema:update --force in dev):
bin/console make:migration bin/console doctrine:migrations:migrate
Claims can also be backed up and restored as JSONL:
bin/console claims:export --scope=tenant:rhs > rhs.jsonl bin/console claims:import --scope=tenant:rhs < rhs.jsonl
Redirection is the default CLI workflow. If you prefer explicit file paths
instead, --output and --input use survos/jsonl-bundle's
JsonlWriter and JsonlReader:
bin/console claims:export --scope=tenant:rhs --output=rhs.jsonl.gz bin/console claims:import --scope=tenant:rhs --input=rhs.jsonl.gz
Quick start
Recording a tool run
use Survos\ClaimsBundle\Service\ClaimIngestor; use Survos\ClaimsBundle\Service\RawClaim; use Survos\DataContracts\Vocabulary\DcTerms; $rawClaims = [ new RawClaim(DcTerms::TITLE->value, 'Welcome to Ocean City', 0.9, basis: "Printed caption reads 'Welcome to Ocean City'."), new RawClaim(DcTerms::DESCRIPTION->value, 'Beach scene with boardwalk.', 0.8), new RawClaim(DcTerms::TYPE->value, 'postcard', 0.95), new RawClaim(DcTerms::SUBJECT->value, 'boardwalk', 0.9), new RawClaim(DcTerms::SUBJECT->value, 'seaside', 0.8), new RawClaim('ssai:has_text', true, 1.0), ]; $run = $ingestor->record( scope: 'tenant:rhs', subjectType: 'image', subjectId: $image->getId(), source: 'enrich_from_thumbnail@1.0', rawClaims: $rawClaims, ); $em->flush();
Prior rows with the same (scope, subject, source) are deleted first; the
whole batch shares one runId.
Reading the best-guess view
use Survos\ClaimsBundle\Service\ClaimAggregator; $view = $aggregator->aggregate('image', $image->getId(), 'tenant:rhs'); // Scalar predicate — one winner: $view['dcterms:title'] // → ['value' => 'Welcome to Ocean City', 'confidence' => 0.9, // 'basis' => "Printed caption …", 'source' => 'enrich_from_thumbnail@1.0'] // List predicate — dedup + union: $view['dcterms:subject'] // → ['value' => ['boardwalk', 'seaside'], 'confidence' => 0.9, // 'source' => 'aggregated', 'items' => [...]]
Documentation
- docs/design.md — the claim model and why it exists
- docs/integration.md — step-by-step consumer wiring
License
MIT