infrastructure tier

infrastructure-sync

Offline-first sync protocol with command/outbox model for WASM clients

Offline-first sync protocol with command/outbox model for WASM clients

Tierinfrastructure
Roleunclassified (baselined)
Pathcrates/infrastructure/sync
Edition2021
Targetsinfrastructure_sync
Public items110 across 5 modules
Tests31

What it is for

# infrastructure-sync

Offline-first sync protocol with command/outbox model.

This crate provides the building blocks for offline-capable WASM admin clients that sync with a server when connectivity is available.

Core Concepts

Architecture

┌─────────────────────────────────────────────────────────────┐
│                     WASM Client                             │
│  ┌──────────┐    ┌──────────┐    ┌──────────────────────┐  │
│  │ UI Layer │───▶│ Commands │───▶│ Outbox (IndexedDB)   │  │
│  └──────────┘    └──────────┘    └──────────────────────┘  │
│                                            │                │
└────────────────────────────────────────────│────────────────┘
│ Online?
▼
┌─────────────────────────────────────────────────────────────┐
│                     Server                                  │
│  ┌──────────────┐    ┌──────────┐    ┌─────────────────┐   │
│  │ Command      │───▶│ Validate │───▶│ Apply + Store   │   │
│  │ Handler      │    │ + Check  │    │ (Postgres)      │   │
│  └──────────────┘    │ Version  │    └─────────────────┘   │
│                      └──────────┘                          │
│                           │                                │
│                           ▼                                │
│                    ┌──────────────┐                        │
│                    │ Ack/Conflict │                        │
│                    └──────────────┘                        │
└─────────────────────────────────────────────────────────────┘

Example

use infrastructure_sync::{
Command, CommandId, IdempotencyKey, OutboxEntry, OutboxStatus,
ServerAck, AckStatus, Conflict,
};
use uuid::Uuid;

// Create a command with idempotency key
let command = Command::CreatePage {
idempotency_key: IdempotencyKey::new(),
slug: "hello-world".to_string(),
title: "Hello World".to_string(),
page_type: "post".to_string(),
content: "My first post".to_string(),
};

// Queue in outbox
let entry = OutboxEntry::new(command);
assert_eq!(entry.status, OutboxStatus::Pending);

// Server processes and acknowledges
let ack = ServerAck::success(entry.command_id, Uuid::new_v4());
assert!(ack.is_success());

Capabilities

Command

Command types for intent-based operations.

Item
pub enum Command
Command :: fn idempotency_key(& self) -> & IdempotencyKey
Command :: fn command_type(& self) -> & 'static str
Command :: fn is_cms_command(& self) -> bool
Command :: fn is_media_command(& self) -> bool
Command :: fn target_entity_id(& self) -> Option <Uuid>
Command :: fn expected_version(& self) -> Option <& Version>

CommandId

Command types for intent-based operations.

Item
pub struct CommandId
CommandId :: fn new() -> Self
CommandId :: fn from_uuid(id : Uuid) -> Self
CommandId :: fn as_uuid(& self) -> Uuid
CommandId :: fn default() -> Self
CommandId :: fn fmt(& self, f : & mut std::fmt::Formatter <'_>) -> std::fmt::Result

IdempotencyKey

Command types for intent-based operations.

Item
pub struct IdempotencyKey
IdempotencyKey :: fn new() -> Self
IdempotencyKey :: fn from_string(key : String) -> Self
IdempotencyKey :: fn as_str(& self) -> & str
IdempotencyKey :: fn default() -> Self
IdempotencyKey :: fn fmt(& self, f : & mut std::fmt::Formatter <'_>) -> std::fmt::Result

Conflict

Conflict detection and resolution types.

Item
pub enum Conflict
Conflict :: fn version_mismatch(client_version : Version, server_version : Version, server_record : JsonValue,) -> Self
Conflict :: fn field_conflicts(conflicts : Vec <FieldConflict>, server_record : JsonValue) -> Self
Conflict :: fn entity_deleted(deleted_at : chrono::DateTime <chrono::Utc>, deleted_by : Option <String>,) -> Self
Conflict :: fn unique_constraint(field : String, value : String, existing_entity_id : Option <uuid::Uuid>,) -> Self
Conflict :: fn business_rule(rule : String, context : JsonValue) -> Self
Conflict :: const fn is_version_mismatch(& self) -> bool
Conflict :: const fn is_field_conflict(& self) -> bool
Conflict :: const fn is_entity_deleted(& self) -> bool
Conflict :: const fn client_version(& self) -> Option <& Version>
Conflict :: const fn server_version(& self) -> Option <& Version>
Conflict :: fn server_record(& self) -> Option <& JsonValue>

ConflictResolution

Conflict detection and resolution types.

Item
pub enum ConflictResolution
ConflictResolution :: const fn requires_user_action(& self) -> bool

FieldConflict

Conflict detection and resolution types.

Item
pub struct FieldConflict
FieldConflict :: fn new(field : String, client_value : JsonValue, server_value : JsonValue) -> Self
FieldConflict :: fn with_base(field : String, client_value : JsonValue, server_value : JsonValue, base_value : JsonValue,) -> Self
FieldConflict :: fn is_true_conflict(& self) -> bool
FieldConflict :: fn only_client_changed(& self) -> bool
FieldConflict :: fn only_server_changed(& self) -> bool

OutboxEntry

Outbox queue for pending commands.

Item
pub struct OutboxEntry
OutboxEntry :: fn new(command : Command) -> Self
OutboxEntry :: fn mark_syncing(& mut self)
OutboxEntry :: fn mark_synced(& mut self, entity_id : Uuid)
OutboxEntry :: fn mark_retry(& mut self, error : String, retry_after : DateTime <Utc>)
OutboxEntry :: fn mark_failed(& mut self, error : String)
OutboxEntry :: fn mark_conflicted(& mut self, conflict_json : String)
OutboxEntry :: fn is_ready_to_retry(& self) -> bool
OutboxEntry :: fn calculate_retry_time(& self) -> DateTime <Utc>
OutboxEntry :: fn max_retries_exceeded(& self, max_retries : u32) -> bool

OutboxStats

Outbox queue for pending commands.

Item
pub struct OutboxStats
OutboxStats :: const fn needs_processing(& self) -> usize
OutboxStats :: const fn needs_attention(& self) -> usize
OutboxStats :: const fn is_idle(& self) -> bool

OutboxStatus

Outbox queue for pending commands.

Item
pub enum OutboxStatus
OutboxStatus :: const fn needs_processing(& self) -> bool
OutboxStatus :: const fn is_terminal(& self) -> bool
OutboxStatus :: const fn requires_user_action(& self) -> bool

Change

Pull protocol for syncing server changes to client.

Item
pub struct Change
Change :: fn new(change_type : ChangeType, entity_type : String, entity_id : Uuid, version : Version, data : JsonValue,) -> Self
Change :: fn created(entity_type : String, entity_id : Uuid, data : JsonValue) -> Self
Change :: fn updated(entity_type : String, entity_id : Uuid, version : Version, data : JsonValue,) -> Self
Change :: fn deleted(entity_type : String, entity_id : Uuid, version : Version) -> Self
Change :: fn with_changed_by(mut self, user_id : Uuid) -> Self
Change :: const fn with_changed_at(mut self, timestamp : DateTime <Utc>) -> Self
Change :: const fn is_create(& self) -> bool
Change :: const fn is_update(& self) -> bool
Change :: const fn is_delete(& self) -> bool

ChangeType

Pull protocol for syncing server changes to client.

Item
pub enum ChangeType
ChangeType :: const fn is_create(& self) -> bool
ChangeType :: const fn is_update(& self) -> bool
ChangeType :: const fn is_delete(& self) -> bool

PullRequest

Pull protocol for syncing server changes to client.

Item
pub struct PullRequest
PullRequest :: fn since(since : DateTime <Utc>) -> Self
PullRequest :: fn full_sync() -> Self
PullRequest :: fn with_entity_types(mut self, types : Vec <String>) -> Self
PullRequest :: const fn with_limit(mut self, limit : u32) -> Self
PullRequest :: fn with_cursor(mut self, cursor : String) -> Self

PullResponse

Pull protocol for syncing server changes to client.

Item
pub struct PullResponse
PullResponse :: fn new(changes : Vec <Change>, sync_timestamp : DateTime <Utc>) -> Self
PullResponse :: fn empty() -> Self
PullResponse :: fn with_pagination(mut self, cursor : String, has_more : bool) -> Self
PullResponse :: fn is_empty(& self) -> bool
PullResponse :: fn count_by_type(& self) -> std::collections::HashMap <ChangeType, usize>

AckStatus

Version tracking for optimistic concurrency control.

Item
pub enum AckStatus
AckStatus :: const fn is_success(& self) -> bool
AckStatus :: const fn is_retryable(& self) -> bool
AckStatus :: const fn is_conflict(& self) -> bool
AckStatus :: const fn is_permanent_error(& self) -> bool

ServerAck

Version tracking for optimistic concurrency control.

Item
pub struct ServerAck
ServerAck :: fn success(command_id : CommandId, entity_id : Uuid) -> Self
ServerAck :: fn success_with_version(command_id : CommandId, entity_id : Uuid, new_version : Version,) -> Self
ServerAck :: fn conflict(command_id : CommandId, conflict : Conflict) -> Self
ServerAck :: fn retryable_error(command_id : CommandId, message : String) -> Self
ServerAck :: fn permanent_error(command_id : CommandId, message : String) -> Self
ServerAck :: const fn is_success(& self) -> bool
ServerAck :: const fn is_conflict(& self) -> bool
ServerAck :: const fn is_retryable(& self) -> bool

Version

Version tracking for optimistic concurrency control.

Item
pub struct Version
Version :: const fn new(version : u64) -> Self
Version :: const fn value(& self) -> u64
Version :: const fn initial() -> Self
Version :: const fn increment(& self) -> Self
Version :: const fn is_newer_than(& self, other : & Self) -> bool
Version :: fn default() -> Self
Version :: fn fmt(& self, f : & mut std::fmt::Formatter <'_>) -> std::fmt::Result
Version :: fn from(value : u64) -> Self

VersionMismatch

Version tracking for optimistic concurrency control.

Item
pub struct VersionMismatch
VersionMismatch :: const fn new(client_version : Version, server_version : Version) -> Self
VersionMismatch :: const fn versions_behind(& self) -> u64

u64

Version tracking for optimistic concurrency control.

Item
u64 :: fn from(value : Version) -> Self

How to use it

From this crate's own rustdoc:


## Example

Module structure

infrastructure_sync

flowchart TD
  n_infrastructure_sync["infrastructure_sync"]
  n_infrastructure_sync --> n_command["command"]
  n_infrastructure_sync --> n_conflict["conflict"]
  n_infrastructure_sync --> n_outbox["outbox"]
  n_infrastructure_sync --> n_pull["pull"]
  n_infrastructure_sync --> n_version["version"]

Public surface

`command`

ItemWhat it is
pub struct CommandIdUnique identifier for a command instance.
CommandId :: fn new() -> SelfCreate a new random command ID.
CommandId :: fn from_uuid(id : Uuid) -> SelfCreate from an existing UUID.
CommandId :: fn as_uuid(& self) -> UuidGet the underlying UUID.
CommandId :: fn default() -> Self
CommandId :: fn fmt(& self, f : & mut std::fmt::Formatter <'_>) -> std::fmt::Result
pub struct IdempotencyKeyIdempotency key for safe command retries
IdempotencyKey :: fn new() -> SelfCreate a new random idempotency key.
IdempotencyKey :: fn from_string(key : String) -> SelfCreate from an existing string.
IdempotencyKey :: fn as_str(& self) -> & strGet the key as a string slice.
IdempotencyKey :: fn default() -> Self
IdempotencyKey :: fn fmt(& self, f : & mut std::fmt::Formatter <'_>) -> std::fmt::Result
pub enum CommandCommands that can be queued and synced
Command :: fn idempotency_key(& self) -> & IdempotencyKeyGet the idempotency key for this command.
Command :: fn command_type(& self) -> & 'static strGet the command type as a string.
Command :: fn is_cms_command(& self) -> boolCheck if this is a CMS command.
Command :: fn is_media_command(& self) -> boolCheck if this is a media command.
Command :: fn target_entity_id(& self) -> Option <Uuid>Get the target entity ID if this command operates on an existing entity.
Command :: fn expected_version(& self) -> Option <& Version>Get the expected version if this command requires optimistic locking.

`conflict`

ItemWhat it is
pub enum ConflictA conflict that occurred during command processing.
Conflict :: fn version_mismatch(client_version : Version, server_version : Version, server_record : JsonValue,) -> SelfCreate a version mismatch conflict.
Conflict :: fn field_conflicts(conflicts : Vec <FieldConflict>, server_record : JsonValue) -> SelfCreate a field conflicts instance.
Conflict :: fn entity_deleted(deleted_at : chrono::DateTime <chrono::Utc>, deleted_by : Option <String>,) -> SelfCreate an entity deleted conflict.
Conflict :: fn unique_constraint(field : String, value : String, existing_entity_id : Option <uuid::Uuid>,) -> SelfCreate a unique constraint conflict.
Conflict :: fn business_rule(rule : String, context : JsonValue) -> SelfCreate a business rule conflict.
Conflict :: const fn is_version_mismatch(& self) -> boolCheck if this is a version mismatch.
Conflict :: const fn is_field_conflict(& self) -> boolCheck if this is a field conflict.
Conflict :: const fn is_entity_deleted(& self) -> boolCheck if the entity was deleted.
Conflict :: const fn client_version(& self) -> Option <& Version>Get the client version if this is a version mismatch.
Conflict :: const fn server_version(& self) -> Option <& Version>Get the server version if this is a version mismatch.
Conflict :: fn server_record(& self) -> Option <& JsonValue>Get the server record if available.
pub struct FieldConflictA conflict on a specific field.
FieldConflict :: fn new(field : String, client_value : JsonValue, server_value : JsonValue) -> SelfCreate a new field conflict.
FieldConflict :: fn with_base(field : String, client_value : JsonValue, server_value : JsonValue, base_value : JsonValue,) -> SelfCreate with a base value for three-way merge.
FieldConflict :: fn is_true_conflict(& self) -> boolCheck if both sides changed from the base (true conflict).
FieldConflict :: fn only_client_changed(& self) -> boolCheck if only the client changed (can auto-merge).
FieldConflict :: fn only_server_changed(& self) -> boolCheck if only the server changed (can auto-merge by taking server).
pub enum ConflictResolutionHow to resolve a conflict.
ConflictResolution :: const fn requires_user_action(& self) -> boolCheck if this requires user interaction.

`outbox`

ItemWhat it is
pub enum OutboxStatusStatus of an outbox entry.
OutboxStatus :: const fn needs_processing(& self) -> boolCheck if this entry needs to be processed.
OutboxStatus :: const fn is_terminal(& self) -> boolCheck if this entry is in a final state.
OutboxStatus :: const fn requires_user_action(& self) -> boolCheck if this entry requires user intervention.
pub struct OutboxEntryAn entry in the outbox queue.
OutboxEntry :: fn new(command : Command) -> SelfCreate a new outbox entry.
OutboxEntry :: fn mark_syncing(& mut self)Mark as currently syncing.
OutboxEntry :: fn mark_synced(& mut self, entity_id : Uuid)Mark as successfully synced.
OutboxEntry :: fn mark_retry(& mut self, error : String, retry_after : DateTime <Utc>)Mark as failed with retry.
OutboxEntry :: fn mark_failed(& mut self, error : String)Mark as failed permanently.
OutboxEntry :: fn mark_conflicted(& mut self, conflict_json : String)Mark as conflicted.
OutboxEntry :: fn is_ready_to_retry(& self) -> boolCheck if ready to retry.
OutboxEntry :: fn calculate_retry_time(& self) -> DateTime <Utc>Calculate next retry time with exponential backoff.
OutboxEntry :: fn max_retries_exceeded(& self, max_retries : u32) -> boolCheck if max retries exceeded.
pub struct OutboxStatsStatistics about the outbox queue.
OutboxStats :: const fn needs_processing(& self) -> usizeCount entries that need processing.
OutboxStats :: const fn needs_attention(& self) -> usizeCount entries that need user attention.
OutboxStats :: const fn is_idle(& self) -> boolCheck if outbox is empty of actionable items.

`pull`

ItemWhat it is
pub struct PullRequestRequest to pull changes from the server.
PullRequest :: fn since(since : DateTime <Utc>) -> SelfCreate a request to pull all changes since a timestamp.
PullRequest :: fn full_sync() -> SelfCreate a request for initial sync (all data).
PullRequest :: fn with_entity_types(mut self, types : Vec <String>) -> SelfFilter to specific entity types.
PullRequest :: const fn with_limit(mut self, limit : u32) -> SelfLimit the number of changes.
PullRequest :: fn with_cursor(mut self, cursor : String) -> SelfContinue from a cursor.
pub struct PullResponseResponse containing changes from the server.
PullResponse :: fn new(changes : Vec <Change>, sync_timestamp : DateTime <Utc>) -> SelfCreate a new pull response.
PullResponse :: fn empty() -> SelfCreate an empty response.
PullResponse :: fn with_pagination(mut self, cursor : String, has_more : bool) -> SelfAdd pagination info.
PullResponse :: fn is_empty(& self) -> boolCheck if there are any changes.
PullResponse :: fn count_by_type(& self) -> std::collections::HashMap <ChangeType, usize>Count changes by type.
pub enum ChangeTypeType of change.
ChangeType :: const fn is_create(& self) -> boolCheck if this is a create.
ChangeType :: const fn is_update(& self) -> boolCheck if this is an update.
ChangeType :: const fn is_delete(& self) -> boolCheck if this is a delete.
pub struct ChangeA single change from the server.
Change :: fn new(change_type : ChangeType, entity_type : String, entity_id : Uuid, version : Version, data : JsonValue,) -> SelfCreate a new change.
Change :: fn created(entity_type : String, entity_id : Uuid, data : JsonValue) -> SelfCreate a "created" change.
Change :: fn updated(entity_type : String, entity_id : Uuid, version : Version, data : JsonValue,) -> SelfCreate an "updated" change.
Change :: fn deleted(entity_type : String, entity_id : Uuid, version : Version) -> SelfCreate a "deleted" change.
Change :: fn with_changed_by(mut self, user_id : Uuid) -> SelfSet who made the change.
Change :: const fn with_changed_at(mut self, timestamp : DateTime <Utc>) -> SelfSet when the change occurred.
Change :: const fn is_create(& self) -> boolCheck if this is a create.
Change :: const fn is_update(& self) -> boolCheck if this is an update.
Change :: const fn is_delete(& self) -> boolCheck if this is a delete.

`version`

ItemWhat it is
pub struct VersionVersion number for optimistic concurrency control
Version :: const fn new(version : u64) -> SelfCreate a new version.
Version :: const fn value(& self) -> u64Get the version number.
Version :: const fn initial() -> SelfCreate the initial version (1).
Version :: const fn increment(& self) -> SelfIncrement the version.
Version :: const fn is_newer_than(& self, other : & Self) -> boolCheck if this version is newer than another.
Version :: fn default() -> Self
Version :: fn fmt(& self, f : & mut std::fmt::Formatter <'_>) -> std::fmt::Result
Version :: fn from(value : u64) -> Self
u64 :: fn from(value : Version) -> Self
pub struct VersionMismatchVersion mismatch information.
VersionMismatch :: const fn new(client_version : Version, server_version : Version) -> SelfCreate a new version mismatch.
VersionMismatch :: const fn versions_behind(& self) -> u64How many versions behind is the client?
pub enum AckStatusStatus of a server acknowledgment.
AckStatus :: const fn is_success(& self) -> boolCheck if the command succeeded.
AckStatus :: const fn is_retryable(& self) -> boolCheck if the command can be retried.
AckStatus :: const fn is_conflict(& self) -> boolCheck if there was a conflict.
AckStatus :: const fn is_permanent_error(& self) -> boolCheck if this is a permanent failure.
pub struct ServerAckServer acknowledgment of a command.
ServerAck :: fn success(command_id : CommandId, entity_id : Uuid) -> SelfCreate a success acknowledgment.
ServerAck :: fn success_with_version(command_id : CommandId, entity_id : Uuid, new_version : Version,) -> SelfCreate a success acknowledgment with version.
ServerAck :: fn conflict(command_id : CommandId, conflict : Conflict) -> SelfCreate a conflict acknowledgment.
ServerAck :: fn retryable_error(command_id : CommandId, message : String) -> SelfCreate a retryable error acknowledgment.
ServerAck :: fn permanent_error(command_id : CommandId, message : String) -> SelfCreate a permanent error acknowledgment.
ServerAck :: const fn is_success(& self) -> boolCheck if the command succeeded.
ServerAck :: const fn is_conflict(& self) -> boolCheck if there was a conflict.
ServerAck :: const fn is_retryable(& self) -> boolCheck if the command can be retried.

Re-exports. Exported here, defined elsewhere.

ExportDefined in
{AckStatus,ServerAck,Version,VersionMismatch}version::{AckStatus,ServerAck,Version,VersionMismatch}
{Change,ChangeType,PullRequest,PullResponse}pull::{Change,ChangeType,PullRequest,PullResponse}
{Command,CommandId,IdempotencyKey}command::{Command,CommandId,IdempotencyKey}
{Conflict,ConflictResolution,FieldConflict}conflict::{Conflict,ConflictResolution,FieldConflict}
{HasId,SoftDeletable,Timestamped}foundation_basemodels::{HasId,SoftDeletable,Timestamped}
{OutboxEntry,OutboxStats,OutboxStatus}outbox::{OutboxEntry,OutboxStats,OutboxStatus}

Boundary

Reaches into foundation.

Shares tier infrastructure with 82 other crates: infrastructure-acquire, infrastructure-adapters-google-calendar, infrastructure-adapters-google-gmail, infrastructure-adapters-google-places, infrastructure-adapters-google-trends, infrastructure-adapters-shodan, infrastructure-adapters-yelp, infrastructure-agent, … (82 total).

_What this crate deliberately does NOT own is a judgment. No committed registry records one for it, so none is stated here._

Where it sits

Tier (ontology)infrastructure
Architectural role (taxonomy)unclassified (baselined)
Locationcrates/infrastructure/sync
Vocabulary in force (lexicon)current

Tier flow. Which tiers this crate's own edges cross.

flowchart LR
  n_infrastructure["infrastructure"] --> n_foundation["foundation"]

Dependencies

Runtime, in this workspace.

CrateTierOptionalOnly on
`foundation-basemodels`foundationnoalways

Runtime, from outside the workspace.

CrateRequirementFeaturesOptionalOnly on
chrono^0.4serdenoalways
serde^1derivenoalways
serde_json^1noalways
thiserror^2noalways
uuid^1v4, v7, serde, jsnoalways

Development, from outside the workspace.

CrateRequirementFeaturesOptionalOnly on
tokio-test^0.4noalways

Build. None.

Depended on by. 2 workspace crates.

Signal flow — what reaches this crate, and what it reaches.

flowchart LR
  n_application_sync["application-sync"] -->|uses| SELF
  n_platform_wasm_ui["platform-wasm-ui"] -->|uses| SELF
  SELF["infrastructure-sync"]
  SELF -->|runtime| n_foundation_basemodels["foundation-basemodels"]
  classDef self fill:#1f883d,stroke:#1f883d,color:#fff;
  class SELF self;

Feature flags

No Cargo features are defined: every capability is unconditional, so no consumer can receive a half-wired crate.

Targets

KindNameSource
libinfrastructure_sync`src/lib.rs`

Error model

No public error type was detected: no public item declares a type named *Error, and no public signature returns one.

Operational characteristics

PropertyEvidence
async public surfacenone detected
async runtimenone detected
database accessnone detected
network I/Onone detected
unsafe codenone detected
environment variablesnone detected

No unsafe block, unsafe fn, unsafe impl or unsafe trait was found by the parser anywhere in this crate's source.

Configuration

No environment variable is read with a literal name anywhere in this crate. A variable whose key is computed at run time cannot be listed here, and is not claimed to be absent.

2 workspace crates depend on this one: application-sync, platform-wasm-ui.

Verification

KindCount
Unit tests31
Integration tests0
Examples0
Doctests1

Evidence by module. How often each public module is named by something executable.

ModuleTestsExamplesConsumers
command303
conflict302
outbox303
pull404
version403

What the tests establish, by name:

Documentation coverage

MeasureDocumentedTotal
Public items with rustdoc102110
Public modules with a //! block55
pie showData
    title Public items with rustdoc
    "Documented" : 102
    "No rustdoc detected" : 8

Metrics

MetricValue
Rust source files6
Source lines1816
Code lines1291
Public API items110
Public modules5
Tests31
Examples0
Cargo features0
Direct runtime dependencies6
Workspace reverse dependencies2
pie showData
    title Public API by kind
    "enum" : 6
    "method" : 93
    "struct" : 11
pie showData
    title Rust source composition
    "Code" : 1291
    "Blank or comment" : 525

Generation

Rendered by tools-corpus corpus readme from repository evidence alone, renderer schema 2, lexicon current. No model, network service or database was consulted. Regenerate with tools-corpus corpus readme --write; verify with --check.

All infrastructure · Manual