idiolect

idiolect

@idiolect.dev

Mutual intelligibility for schema idiolects built on @panproto.dev. idiolect.dev

22 followers2 following49 posts

We have a new release (v0.13.0) that introduces a bunch of new community management tooling. There is now one portable path from a governed definition change through consequence analysis, review, verification, signed release, resumable migration, federation, and exit.

github.comRelease v0.13.0 · idiolect-dev/idiolectAdded Community control plane for 0.13.0. The new idiolect-community crate and CLI lifecycle provide versioned idiolect.toml workspaces, role-aware maintainer/consent/vote/steward/hybrid governanc...
View full thread

The orchestrator catalogs all four record kinds and adds seven REST/XRPC queries for changes, releases, migrations, and federation relationships. Two observer methods summarize migration health and release adoption without making either observer authoritative.

Finally, fieldwork now presents the same lifecycle as a Community Workbench. Orient explains the current step; Act exposes the decision; Inspect opens evidence and operational state; Interoperate opens schemas, protocol identifiers, digests, signatures, and mappings.

idiolect.devfieldworkA workshop for community schema curation on atproto. Compose dialects, vocabularies, communities, recommendations, and lens uploads against the dev.idiolect.* lexicon family. Publish straight to your ...

We have a new release (v0.13.0) that introduces a bunch of new community management tooling. There is now one portable path from a governed definition change through consequence analysis, review, verification, signed release, resumable migration, federation, and exit.

github.comRelease v0.13.0 · idiolect-dev/idiolectAdded Community control plane for 0.13.0. The new idiolect-community crate and CLI lifecycle provide versioned idiolect.toml workspaces, role-aware maintainer/consent/vote/steward/hybrid governanc...
View full thread

Approved packets become P-256/ES256-signed release indexes over artifacts, dependencies, and digests. Migration runs retain cursors, progress, and sampled failures so work can resume after interruption. Exports reject symlinks and carry a SHA-256 inventory.

Four new records publish the interoperable part of that lifecycle: dev.idiolect.changeProposal, communityRelease, migrationRun, and federation. Private keys, local paths, and draft evidence remain in the workspace rather than becoming network records.

We have a new release (v0.13.0) that introduces a bunch of new community management tooling. There is now one portable path from a governed definition change through consequence analysis, review, verification, signed release, resumable migration, federation, and exit.

github.comRelease v0.13.0 · idiolect-dev/idiolectAdded Community control plane for 0.13.0. The new idiolect-community crate and CLI lifecycle provide versioned idiolect.toml workspaces, role-aware maintainer/consent/vote/steward/hybrid governanc...

idiolect-community starts with an idiolect.toml workspace: community identity, governed packages, authorities, decision rules, resource limits, and exit policy. A change packet keeps the schema diff, participant-facing consequences, reviews, and verification evidence together.

Governance supports maintainer approval, consent, threshold vote, steward approval, and maintainer + steward rules. Verification remains three-valued: verified, refuted, or incomplete. A release gate accepts only verified evidence for every check required by policy.

idiolect verify <kind> wraps each of the four shipped runners (roundtrip-test, property-test, static-check, coercion-law) against a live PDS. Corpora accept JSON arrays or JSONL.

idiolect-migrate streams a directory of JSON records through migrate_record against a published lens and writes a target directory.

idiolect oauth login | list | logout exchanges a handle plus app password for an access JWT via com.atproto.server.createSession and stores the session as JSON per DID under $IDIOLECT_SESSION_DIR. The app-password Bearer is transitional; an OAuth + DPoP follow-up is on deck.

idiolect publish <kind> --record <path> validates the JSON against the typed Record impl, splices in $type, generates a TID-shaped rkey, and POSTs com.atproto.repo.createRecord under a stored session. Short kind names map to dev.idiolect.* NSIDs.

PdsSchemaLoader<C> takes any PdsClient and fetches dev.panproto.schema.schema records, pulling the typed panproto_schema::Schema out of the record's blob field.

Pair it with PdsResolver on a shared ReqwestPdsClient and apply_lens runs end to end over a live PDS: resolve the lens by at-uri, load source + target schemas off the same network, project the source record, and return the view.

idiolect reposted

We have a new project! Didactic is a typed data library for python built on top of panproto. It provides class-based authoring like pydantic. But under the hood each Model is a panproto Theory, which gives you access to panproto's migration and codegen capabilities. Docs at panproto.dev/didactic/.

github.comGitHub - panproto/didactic: A typed data library for Python on top of panproto.A typed data library for Python on top of panproto. - panproto/didactic

And fieldwork now supports the new lexicons!

idiolect.devfieldworkA workshop for community schema curation on atproto. Compose dialects, vocabularies, communities, recommendations, and lens uploads against the dev.idiolect.* lexicon family; publish straight to your ...
idiolect@idiolect.dev

We have a new release (v0.7.0) that adds dev.idiolect.deliberation* lexicons (a process-shaped counterpart to settled belief or recommendation), generalizes dev.idiolect.vocab into a full RDFS + OWL Lite + SKOS Core knowledge graph, and adopts a protolens-based lexicon-evolution policy.

We have a new release (v0.7.0) that adds dev.idiolect.deliberation* lexicons (a process-shaped counterpart to settled belief or recommendation), generalizes dev.idiolect.vocab into a full RDFS + OWL Lite + SKOS Core knowledge graph, and adopts a protolens-based lexicon-evolution policy.

github.comRelease v0.7.0 · idiolect-dev/idiolectAdded dev.idiolect.deliberation, dev.idiolect.deliberationStatement, dev.idiolect.deliberationVote, and dev.idiolect.deliberationOutcome lexicons. The four together model community-scoped delibera...
View full thread

Closed enums across the lexicon family have been converted to knownValues + vocabRef pointers (similar to @chive.pub). Codegen emits Rust enums with Other(String) fallback and TS as 'a' | 'b' | (string & {}). Each open enum gets is_subsumed_by, satisfies, and translate_to methods over a VocabGraph.

Lexicon revision now flows through six @panproto.dev-backed stages: diff, derive protolens, classify Iso/Injection/Projection/Affine/General, coercion-law check, roundtrip verification, and lens publication.

We have a new release (v0.7.0) that adds dev.idiolect.deliberation* lexicons (a process-shaped counterpart to settled belief or recommendation), generalizes dev.idiolect.vocab into a full RDFS + OWL Lite + SKOS Core knowledge graph, and adopts a protolens-based lexicon-evolution policy.

github.comRelease v0.7.0 · idiolect-dev/idiolectAdded dev.idiolect.deliberation, dev.idiolect.deliberationStatement, dev.idiolect.deliberationVote, and dev.idiolect.deliberationOutcome lexicons. The four together model community-scoped delibera...

The four new lexicons (deliberation, deliberationStatement, deliberationVote, deliberationOutcome) subsume Acorn's community.blacksky.assembly.* records losslessly. Stance, classification, and status are open-enum slugs resolved through community-published vocabularies.

dev.idiolect.vocab now carries typed nodes (concept, relation, instance, type, collection) and typed edges alongside the legacy tree. Modeled on pub.chive.graph.{node,edge}. It supports full OWL Lite property characteristics plus SKOS Core annotations (label, scopeNote, notation, externalIds).

We have a new release (v0.6.0) that exposes FamilyConfig through the codegen public API so downstream consumers can use the same emit pipeline against their own record family without vendoring the target loops. This release also includes typed wrappers for cid-link and IETF BCP 47 language tags.

github.comRelease v0.6.0 · idiolect-dev/idiolectAdded idiolect_records::Cid newtype with parse-time multibase + multihash validation via the cid crate. Codegen now emits dev.idiolect.* cid-link fields as Option<Cid> (was Option<String>). The wr...
View full thread

The TypeScript half gains a generated family.ts that mirrors the Rust family.rs surface. The membership predicate uses an exact NSID set lookup so the type narrowing is sound.

cid-link fields now emit as idiolect_records::Cid (validated via the cid crate) and language fields emit as idiolect_records::Language (validated via language-tags / BCP 47). Both wrappers preserve the canonical wire form so byte-for-byte fixture round-trips stay stable.

We have a new release (v0.6.0) that exposes FamilyConfig through the codegen public API so downstream consumers can use the same emit pipeline against their own record family without vendoring the target loops. This release also includes typed wrappers for cid-link and IETF BCP 47 language tags.

github.comRelease v0.6.0 · idiolect-dev/idiolectAdded idiolect_records::Cid newtype with parse-time multibase + multihash validation via the cid crate. Codegen now emits dev.idiolect.* cid-link fields as Option<Cid> (was Option<String>). The wr...

emit_rust, emit_typescript, and TargetEmitter::emit now take a &FamilyConfig. The CLI continues to pass idiolect_family() so its surface is unchanged; layers-codegen and other downstream consumers construct FamilyConfig::new("MyFamily", "my.ns", "my.ns.") and call the same entry points.

FamilyConfig fields are Cow<'static, str> rather than &'static str, so an external caller can construct one from runtime-owned strings without Box::leak. Static-literal call sites stay zero-allocation through Cow::Borrowed.

View full thread

Lexicon validation runs through panproto live in the editor, so panproto's atproto-lexicon parser flags issues before you publish.

The suite is six tools sharing one in-memory workspace: five composers (dialects, vocabularies, communities, recommendations, and a lens uploader) plus a Lexicon Browser. Imports in one tool feed suggestions in the next.

Each editor has the same import and export shape: paste an at-uri, drop a JSON file, or pick a bundled fixture to start. Then download the record JSON, copy an idiolect-cli invocation, or sign in and publish to your PDS.

We have a new release (v0.5.0) that lifts the dev.idiolect.* record set into a first-class RecordFamily abstraction and parameterizes workspace boundaries over it. The indexer, handlers, observer, and orchestrator are all generic over a record family now.

github.comRelease v0.5.0 · idiolect-dev/idiolectAdded idiolect_records::family::RecordFamily trait. Every record-set scoped boundary in the workspace (indexer, handlers, soon orchestrator + verify) parameterises over a family rather than hardco...
View full thread

Out-of-family commits drop silently before decode, so an upstream PDS adding a record type ahead of codegen no longer halts the loop.

A contains-true plus decode-None mismatch is a family-implementation bug, not a data bug, so the indexer surfaces it as a dedicated IndexerError::FamilyContract variant rather than a generic handler error. This should be easier to debug and easier to reason about at the boundary.

We have a new release (v0.5.0) that lifts the dev.idiolect.* record set into a first-class RecordFamily abstraction and parameterizes workspace boundaries over it. The indexer, handlers, observer, and orchestrator are all generic over a record family now.

github.comRelease v0.5.0 · idiolect-dev/idiolectAdded idiolect_records::family::RecordFamily trait. Every record-set scoped boundary in the workspace (indexer, handlers, soon orchestrator + verify) parameterises over a family rather than hardco...
View full thread

OrFamily<F1, F2> composes two families into one that recognizes every NSID either side contains. Its AnyRecord is OrAny, which is a tagged union over the two halves.

drive_indexer is generic over families now. The default type parameter is IdiolectFamily, so callers can keep using drive_idiolect_indexer with no type arguments.

We have a new release (v0.5.0) that lifts the dev.idiolect.* record set into a first-class RecordFamily abstraction and parameterizes workspace boundaries over it. The indexer, handlers, observer, and orchestrator are all generic over a record family now.

github.comRelease v0.5.0 · idiolect-dev/idiolectAdded idiolect_records::family::RecordFamily trait. Every record-set scoped boundary in the workspace (indexer, handlers, soon orchestrator + verify) parameterises over a family rather than hardco...

RecordFamily is a trait with a contains predicate over NSIDs, a decoder into the family's AnyRecord, and a serializer back. IdiolectFamily implements it for dev.idiolect.* via the codegen-emitted family module. Adding a record remains a one-file lexicon change.

We have a new release (v0.4.0) that types every format-declared lexicon field at the Rust boundary, adds Datetime and Uri typed wrappers, and disambiguates crate-root re-exports when two records under different parents share a leaf TypeName.

github.comRelease v0.4.0 · idiolect-dev/idiolectAdded idiolect_records::Datetime and idiolect_records::Uri typed newtypes alongside the v0.3.0 Nsid, AtUri, and Did. Each validates at parse time (time::OffsetDateTime for RFC 3339, url::Url for U...
View full thread

Datetime and Uri are new newtypes alongside the v0.3.0 Nsid, AtUri, Did. Datetime validates RFC 3339 via time::OffsetDateTime; Uri validates via url::Url. Both expose Deref<Target=str> and the full FromStr-Display-serde trait surface.

When two records under different parent namespaces share a leaf TypeName–e.g. changelog::Entry vs resource::Entry–idiolect-codegen walks each path up until each member's prefix is unique within the colliding group and aliases–e.g. ChangelogEntry and ResourceEntry.

We have a new release (v0.4.0) that types every format-declared lexicon field at the Rust boundary, adds Datetime and Uri typed wrappers, and disambiguates crate-root re-exports when two records under different parents share a leaf TypeName.

github.comRelease v0.4.0 · idiolect-dev/idiolectAdded idiolect_records::Datetime and idiolect_records::Uri typed newtypes alongside the v0.3.0 Nsid, AtUri, and Did. Each validates at parse time (time::OffsetDateTime for RFC 3339, url::Url for U...

Lexicon fields with a format declaration now emit as the format's typed wrapper: - "at-uri" -> AtUri - "did" -> Did, - "datetime" -> Datetime - "uri" -> Uri - "nsid" -> Nsid Previously every format collapsed to String.

View full thread

Vendored dev.panproto.* lexicons are caught up to v0.39.0. github.com/panproto/pan... PanprotoVcsClient now covers the full dev.panproto.sync.* xrpc surface, not just one fetch_object: object reads, ref reads and writes, commit traversal, schema tree, and registry listings are all supported now.

One of the more interesting changes is the new coercion-law verification kind. CoercionLawRunner dispatches a lens to panproto's verifyCoercionLaws xrpc and falsifies on coercion law violations. This is done generically over a CoercionLawClient so deployments can plug in their own http client.

Nsid, AtUri, and Did are typed values now that are spec-checked at parse time. A malformed identifier can't reach the firehose decoder, indexer, observer, codegen, or orchestrator.

The generated Rust and TypeScript trees now mirror the lexicon tree one to one. No more flat-filename collisions when two lexicons share a last segment.

You are up to date.