Notes and tagging for any model via generic foreign keys
| Tier | content |
| Role | unclassified (baselined) |
| Path | crates/content/notes |
| Edition | 2021 |
| Targets | content_notes |
| Public items | 93 across 6 modules |
| Tests | 69 |
What it is for
# content-notes
Notes and tagging library crates for any model via generic foreign keys.
Core Concepts
- Generic FK pattern: Attach notes and tags to any model using
target_type+target_id - Three-tier visibility: Public, Internal (default), or Private notes
- Reusable tags: Define tags with colors, apply to any object
- Soft delete: Preserve notes and tags for audit trail
Example
use content_notes::{Note, Tag, ObjectTag, Visibility, colors};
use uuid::Uuid;
// Create a note attached to a patient
let note = Note::builder()
.target("patients.Patient", "patient-123")
.content("Follow-up scheduled for next week")
.author(Uuid::new_v4())
.visibility(Visibility::Internal)
.build();
// Create a reusable tag
let urgent_tag = Tag::builder()
.name("Urgent")
.red()
.description("Requires immediate attention")
.build();
// Apply tag to a project
let object_tag = ObjectTag::builder()
.target("projects.Project", "project-456")
.tag(urgent_tag.id)
.tagged_by(Uuid::new_v4())
.build();
Capabilities
colors (other)
Standard tag colors.
| Item |
|---|
pub const RED: & str |
pub const ORANGE: & str |
pub const YELLOW: & str |
pub const GREEN: & str |
pub const BLUE: & str |
pub const PURPLE: & str |
pub const GRAY: & str |
pub const DEFAULT: & str |
fn is_valid_hex(color : & str) -> bool |
fn normalize(color : & str) -> String |
NotesError
Error types for the notes crate.
| Item |
|---|
pub enum NotesError |
NotesError :: fn note_not_found(id : Uuid) -> Self |
NotesError :: fn tag_not_found(slug : impl Into <String>) -> Self |
NotesError :: fn tag_not_found_by_id(id : Uuid) -> Self |
NotesError :: fn object_tag_not_found(id : Uuid) -> Self |
NotesError :: fn duplicate_slug(slug : impl Into <String>) -> Self |
NotesError :: fn tag_already_applied(tag_slug : impl Into <String>, target_type : impl Into <String>, target_id : impl Into <String>,) -> Self |
NotesError :: fn invalid_color(color : impl Into <String>) -> Self |
Note:Note
Note model for attaching comments to any target.
| Item |
|---|
pub struct Note |
Note:builder
Note model for attaching comments to any target.
| Item |
|---|
Note :: fn builder() -> NoteBuilder |
Note:can
Note model for attaching comments to any target.
| Item |
|---|
Note :: fn can_view(& self, user_id : Option <Uuid>, is_staff : bool) -> bool |
Note:created
Note model for attaching comments to any target.
| Item |
|---|
Note :: fn created_at(& self) -> DateTime <Utc> |
Note:deleted
Note model for attaching comments to any target.
| Item |
|---|
Note :: fn deleted_at(& self) -> Option <DateTime <Utc>> |
Note:id
Note model for attaching comments to any target.
| Item |
|---|
Note :: fn id(& self) -> Uuid |
Note:is
Note model for attaching comments to any target.
| Item |
|---|
Note :: fn is_for(& self, target_type : & str, target_id : & str) -> bool |
Note :: fn is_by(& self, author_id : Uuid) -> bool |
Note :: fn is_system_note(& self) -> bool |
Note:preview
Note model for attaching comments to any target.
| Item |
|---|
Note :: fn preview(& self, max_chars : usize) -> & str |
Note:restore
Note model for attaching comments to any target.
| Item |
|---|
Note :: fn restore(& mut self) |
Note:soft
Note model for attaching comments to any target.
| Item |
|---|
Note :: fn soft_delete(& mut self) |
Note:updated
Note model for attaching comments to any target.
| Item |
|---|
Note :: fn updated_at(& self) -> DateTime <Utc> |
NoteBuilder
Note model for attaching comments to any target.
| Item |
|---|
pub struct NoteBuilder |
NoteBuilder :: fn new() -> Self |
NoteBuilder :: fn target(mut self, target_type : impl Into <String>, target_id : impl Into <String>) -> Self |
NoteBuilder :: fn content(mut self, content : impl Into <String>) -> Self |
NoteBuilder :: fn author(mut self, author_id : Uuid) -> Self |
NoteBuilder :: fn visibility(mut self, visibility : Visibility) -> Self |
NoteBuilder :: fn public(self) -> Self |
NoteBuilder :: fn internal(self) -> Self |
NoteBuilder :: fn private(self) -> Self |
NoteBuilder :: fn metadata(mut self, metadata : JsonValue) -> Self |
NoteBuilder :: fn build(self) -> Note |
ObjectTag:ObjectTag
ObjectTag model for linking tags to any target.
| Item |
|---|
pub struct ObjectTag |
ObjectTag:builder
ObjectTag model for linking tags to any target.
| Item |
|---|
ObjectTag :: fn builder() -> ObjectTagBuilder |
ObjectTag:created
ObjectTag model for linking tags to any target.
| Item |
|---|
ObjectTag :: fn created_at(& self) -> DateTime <Utc> |
ObjectTag:deleted
ObjectTag model for linking tags to any target.
| Item |
|---|
ObjectTag :: fn deleted_at(& self) -> Option <DateTime <Utc>> |
ObjectTag:id
ObjectTag model for linking tags to any target.
| Item |
|---|
ObjectTag :: fn id(& self) -> Uuid |
ObjectTag:is
ObjectTag model for linking tags to any target.
| Item |
|---|
ObjectTag :: fn is_for(& self, target_type : & str, target_id : & str) -> bool |
ObjectTag :: fn is_tag(& self, tag_id : Uuid) -> bool |
ObjectTag :: fn is_by(& self, user_id : Uuid) -> bool |
ObjectTag :: fn is_system_tag(& self) -> bool |
ObjectTag:matches
ObjectTag model for linking tags to any target.
| Item |
|---|
ObjectTag :: fn matches(& self, target_type : & str, target_id : & str, tag_id : Uuid) -> bool |
ObjectTag:restore
ObjectTag model for linking tags to any target.
| Item |
|---|
ObjectTag :: fn restore(& mut self) |
ObjectTag:soft
ObjectTag model for linking tags to any target.
| Item |
|---|
ObjectTag :: fn soft_delete(& mut self) |
ObjectTag:updated
ObjectTag model for linking tags to any target.
| Item |
|---|
ObjectTag :: fn updated_at(& self) -> DateTime <Utc> |
ObjectTagBuilder
ObjectTag model for linking tags to any target.
| Item |
|---|
pub struct ObjectTagBuilder |
ObjectTagBuilder :: fn new() -> Self |
ObjectTagBuilder :: fn target(mut self, target_type : impl Into <String>, target_id : impl Into <String>) -> Self |
ObjectTagBuilder :: fn tag(mut self, tag_id : Uuid) -> Self |
ObjectTagBuilder :: fn tagged_by(mut self, user_id : Uuid) -> Self |
ObjectTagBuilder :: fn build(self) -> ObjectTag |
Tag
Tag model for reusable labels.
| Item |
|---|
pub struct Tag |
Tag :: fn builder() -> TagBuilder |
Tag :: fn matches_slug(& self, slug : & str) -> bool |
Tag :: fn slugify(name : & str) -> String |
Tag :: fn id(& self) -> Uuid |
Tag :: fn created_at(& self) -> DateTime <Utc> |
Tag :: fn updated_at(& self) -> DateTime <Utc> |
Tag :: fn deleted_at(& self) -> Option <DateTime <Utc>> |
Tag :: fn soft_delete(& mut self) |
Tag :: fn restore(& mut self) |
TagBuilder:TagBuilder
Tag model for reusable labels.
| Item |
|---|
pub struct TagBuilder |
TagBuilder:blue
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn blue(self) -> Self |
TagBuilder:build
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn build(self) -> Tag |
TagBuilder:color
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn color(mut self, color : impl Into <String>) -> Self |
TagBuilder:description
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn description(mut self, description : impl Into <String>) -> Self |
TagBuilder:gray
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn gray(self) -> Self |
TagBuilder:green
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn green(self) -> Self |
TagBuilder:name
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn name(mut self, name : impl Into <String>) -> Self |
TagBuilder:new
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn new() -> Self |
TagBuilder:orange
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn orange(self) -> Self |
TagBuilder:purple
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn purple(self) -> Self |
TagBuilder:red
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn red(self) -> Self |
TagBuilder:slug
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn slug(mut self, slug : impl Into <String>) -> Self |
TagBuilder:yellow
Tag model for reusable labels.
| Item |
|---|
TagBuilder :: fn yellow(self) -> Self |
Visibility
Visibility levels for notes.
| Item |
|---|
pub enum Visibility |
Visibility :: fn as_str(& self) -> & 'static str |
Visibility :: fn parse(s : & str) -> Option <Self> |
Visibility :: fn is_public(& self) -> bool |
Visibility :: fn requires_auth(& self) -> bool |
Visibility :: fn is_private(& self) -> bool |
Visibility :: fn fmt(& self, f : & mut std::fmt::Formatter <'_>) -> std::fmt::Result |
Visibility :: fn from_str(s : & str) -> Result <Self, Self::Err> |
How to use it
From this crate's own rustdoc:
use content_notes::{Note, Tag, ObjectTag, Visibility, colors};
use uuid::Uuid;
// Create a note attached to a patient
let note = Note::builder()
.target("patients.Patient", "patient-123")
.content("Follow-up scheduled for next week")
.author(Uuid::new_v4())
.visibility(Visibility::Internal)
.build();
// Create a reusable tag
let urgent_tag = Tag::builder()
.name("Urgent")
.red()
.description("Requires immediate attention")
.build();
// Apply tag to a project
let object_tag = ObjectTag::builder()
.target("projects.Project", "project-456")
.tag(urgent_tag.id)
.tagged_by(Uuid::new_v4())
.build();
Module structure
content_notes
colorserrornoteobject_tagtagvisibility
flowchart TD n_content_notes["content_notes"] n_content_notes --> n_colors["colors"] n_content_notes --> n_error["error"] n_content_notes --> n_note["note"] n_content_notes --> n_object_tag["object_tag"] n_content_notes --> n_tag["tag"] n_content_notes --> n_visibility["visibility"]
Public surface
`colors`
| Item | What it is |
|---|---|
pub const RED: & str | Red color for urgent/critical tags. |
pub const ORANGE: & str | Orange color for warning/attention tags. |
pub const YELLOW: & str | Yellow color for caution/pending tags. |
pub const GREEN: & str | Green color for success/approved tags. |
pub const BLUE: & str | Blue color for info/reference tags. |
pub const PURPLE: & str | Purple color for special/premium tags. |
pub const GRAY: & str | Gray color for neutral/default tags. |
pub const DEFAULT: & str | Default tag color (gray). |
fn is_valid_hex(color : & str) -> bool | Check if a string is a valid hex color. |
fn normalize(color : & str) -> String | Normalize a hex color to uppercase. |
`error`
| Item | What it is |
|---|---|
pub enum NotesError | Errors that can occur in note operations. |
NotesError :: fn note_not_found(id : Uuid) -> Self | Create a new NoteNotFound error. |
NotesError :: fn tag_not_found(slug : impl Into <String>) -> Self | Create a new TagNotFound error by slug. |
NotesError :: fn tag_not_found_by_id(id : Uuid) -> Self | Create a new TagNotFoundById error. |
NotesError :: fn object_tag_not_found(id : Uuid) -> Self | Create a new ObjectTagNotFound error. |
NotesError :: fn duplicate_slug(slug : impl Into <String>) -> Self | Create a new DuplicateSlug error. |
NotesError :: fn tag_already_applied(tag_slug : impl Into <String>, target_type : impl Into <String>, target_id : impl Into <String>,) -> Self | Create a new TagAlreadyApplied error. |
NotesError :: fn invalid_color(color : impl Into <String>) -> Self | Create a new InvalidColor error. |
`note`
| Item | What it is |
|---|---|
pub struct Note | A note attached to any target via generic foreign key. |
Note :: fn builder() -> NoteBuilder | Create a new note builder. |
Note :: fn is_for(& self, target_type : & str, target_id : & str) -> bool | Check if this note is for the given target. |
Note :: fn is_by(& self, author_id : Uuid) -> bool | Check if this note was created by the given author. |
Note :: fn is_system_note(& self) -> bool | Check if this is a system-generated note (no author). |
Note :: fn can_view(& self, user_id : Option <Uuid>, is_staff : bool) -> bool | Check if a user can view this note based on visibility |
Note :: fn preview(& self, max_chars : usize) -> & str | Get content preview (first N characters). |
Note :: fn id(& self) -> Uuid | — |
Note :: fn created_at(& self) -> DateTime <Utc> | — |
Note :: fn updated_at(& self) -> DateTime <Utc> | — |
Note :: fn deleted_at(& self) -> Option <DateTime <Utc>> | — |
Note :: fn soft_delete(& mut self) | Mark as soft-deleted. |
Note :: fn restore(& mut self) | Restore from soft-deleted state. |
pub struct NoteBuilder | Builder for Note. |
NoteBuilder :: fn new() -> Self | Create a new builder. |
NoteBuilder :: fn target(mut self, target_type : impl Into <String>, target_id : impl Into <String>) -> Self | Set the target. |
NoteBuilder :: fn content(mut self, content : impl Into <String>) -> Self | Set the content. |
NoteBuilder :: fn author(mut self, author_id : Uuid) -> Self | Set the author. |
NoteBuilder :: fn visibility(mut self, visibility : Visibility) -> Self | Set visibility. |
NoteBuilder :: fn public(self) -> Self | Set as public visibility. |
NoteBuilder :: fn internal(self) -> Self | Set as internal visibility. |
NoteBuilder :: fn private(self) -> Self | Set as private visibility. |
NoteBuilder :: fn metadata(mut self, metadata : JsonValue) -> Self | Set metadata. |
NoteBuilder :: fn build(self) -> Note | Build the note |
`object_tag`
| Item | What it is |
|---|---|
pub struct ObjectTag | Links a tag to any target via generic foreign key. |
ObjectTag :: fn builder() -> ObjectTagBuilder | Create a new object tag builder. |
ObjectTag :: fn is_for(& self, target_type : & str, target_id : & str) -> bool | Check if this object tag is for the given target. |
ObjectTag :: fn is_tag(& self, tag_id : Uuid) -> bool | Check if this object tag uses the given tag. |
ObjectTag :: fn is_by(& self, user_id : Uuid) -> bool | Check if this object tag was created by the given user. |
ObjectTag :: fn is_system_tag(& self) -> bool | Check if this is a system-applied tag (no user). |
ObjectTag :: fn matches(& self, target_type : & str, target_id : & str, tag_id : Uuid) -> bool | Check if this matches the given target and tag. |
ObjectTag :: fn id(& self) -> Uuid | — |
ObjectTag :: fn created_at(& self) -> DateTime <Utc> | — |
ObjectTag :: fn updated_at(& self) -> DateTime <Utc> | — |
ObjectTag :: fn deleted_at(& self) -> Option <DateTime <Utc>> | — |
ObjectTag :: fn soft_delete(& mut self) | Mark as soft-deleted. |
ObjectTag :: fn restore(& mut self) | Restore from soft-deleted state. |
pub struct ObjectTagBuilder | Builder for ObjectTag. |
ObjectTagBuilder :: fn new() -> Self | Create a new builder. |
ObjectTagBuilder :: fn target(mut self, target_type : impl Into <String>, target_id : impl Into <String>) -> Self | Set the target. |
ObjectTagBuilder :: fn tag(mut self, tag_id : Uuid) -> Self | Set the tag ID. |
ObjectTagBuilder :: fn tagged_by(mut self, user_id : Uuid) -> Self | Set who applied the tag. |
ObjectTagBuilder :: fn build(self) -> ObjectTag | Build the object tag |
`tag`
| Item | What it is |
|---|---|
pub struct Tag | A reusable tag/label for categorization. |
Tag :: fn builder() -> TagBuilder | Create a new tag builder. |
Tag :: fn matches_slug(& self, slug : & str) -> bool | Check if this tag matches the given slug. |
Tag :: fn slugify(name : & str) -> String | Generate a slug from a name |
Tag :: fn id(& self) -> Uuid | — |
Tag :: fn created_at(& self) -> DateTime <Utc> | — |
Tag :: fn updated_at(& self) -> DateTime <Utc> | — |
Tag :: fn deleted_at(& self) -> Option <DateTime <Utc>> | — |
Tag :: fn soft_delete(& mut self) | Mark as soft-deleted. |
Tag :: fn restore(& mut self) | Restore from soft-deleted state. |
pub struct TagBuilder | Builder for Tag. |
TagBuilder :: fn new() -> Self | Create a new builder. |
TagBuilder :: fn name(mut self, name : impl Into <String>) -> Self | Set the display name. |
TagBuilder :: fn slug(mut self, slug : impl Into <String>) -> Self | Set the slug (URL-friendly identifier). |
TagBuilder :: fn color(mut self, color : impl Into <String>) -> Self | Set the color (hex format). |
TagBuilder :: fn red(self) -> Self | Set color to red. |
TagBuilder :: fn orange(self) -> Self | Set color to orange. |
TagBuilder :: fn yellow(self) -> Self | Set color to yellow. |
TagBuilder :: fn green(self) -> Self | Set color to green. |
TagBuilder :: fn blue(self) -> Self | Set color to blue. |
TagBuilder :: fn purple(self) -> Self | Set color to purple. |
TagBuilder :: fn gray(self) -> Self | Set color to gray. |
TagBuilder :: fn description(mut self, description : impl Into <String>) -> Self | Set the description. |
TagBuilder :: fn build(self) -> Tag | Build the tag |
`visibility`
| Item | What it is |
|---|---|
pub enum Visibility | Visibility level for a note |
Visibility :: fn as_str(& self) -> & 'static str | Get the string representation. |
Visibility :: fn parse(s : & str) -> Option <Self> | Parse from string. |
Visibility :: fn is_public(& self) -> bool | Check if this visibility allows public access. |
Visibility :: fn requires_auth(& self) -> bool | Check if this visibility requires authentication. |
Visibility :: fn is_private(& self) -> bool | Check if this visibility is author-only. |
Visibility :: fn fmt(& self, f : & mut std::fmt::Formatter <'_>) -> std::fmt::Result | — |
Visibility :: fn from_str(s : & str) -> Result <Self, Self::Err> | — |
Re-exports. Exported here, defined elsewhere.
| Export | Defined in |
|---|---|
NotesError | error::NotesError |
Visibility | visibility::Visibility |
colorsastag_colors | colorsastag_colors |
{HasId,SoftDeletable,Timestamped} | foundation_basemodels::{HasId,SoftDeletable,Timestamped} |
{Note,NoteBuilder} | note::{Note,NoteBuilder} |
{ObjectTag,ObjectTagBuilder} | object_tag::{ObjectTag,ObjectTagBuilder} |
{Tag,TagBuilder} | tag::{Tag,TagBuilder} |
Boundary
Reaches into foundation.
Shares tier content with 5 other crates: content-assets, content-calendar, content-calendar-recurrence, content-cms, content-directory-listing.
_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) | content |
| Architectural role (taxonomy) | unclassified (baselined) |
| Location | crates/content/notes |
| Vocabulary in force (lexicon) | current |
Tier flow. Which tiers this crate's own edges cross.
flowchart LR n_content["content"] --> n_foundation["foundation"]
Dependencies
Runtime, in this workspace.
| Crate | Tier | Optional | Only on |
|---|---|---|---|
| `foundation-basemodels` | foundation | no | always |
Runtime, from outside the workspace.
| Crate | Requirement | Features | Optional | Only on |
|---|---|---|---|---|
chrono | ^0.4 | serde | no | always |
serde | ^1 | derive | no | always |
serde_json | ^1 | — | no | always |
sqlx | ^0.8 | runtime-tokio, postgres, chrono, uuid, json | no | always |
thiserror | ^2 | — | no | always |
tokio | ^1 | full | no | always |
uuid | ^1 | v4, v7, serde, js | no | always |
Development, from outside the workspace.
| Crate | Requirement | Features | Optional | Only on |
|---|---|---|---|---|
tokio-test | ^0.4 | — | no | always |
Build. None.
Depended on by. 1 workspace crate.
Signal flow — what reaches this crate, and what it reaches.
flowchart LR n_application_notes["application-notes"] -->|uses| SELF SELF["content-notes"] 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
| Kind | Name | Source |
|---|---|---|
| lib | content_notes | `src/lib.rs` |
Error model
| Error type | Named by |
|---|---|
NotesError | declared, no public signature returns it |
Operational characteristics
| Property | Evidence |
|---|---|
| async public surface | none detected |
| async runtime | yes |
| database access | yes |
| network I/O | none detected |
| unsafe code | none detected |
| environment variables | none 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.
Related capabilities
1 workspace crate depends on this one: application-notes.
Verification
| Kind | Count |
|---|---|
| Unit tests | 69 |
| Integration tests | 0 |
| Examples | 0 |
| Doctests | 1 |
Evidence by module. How often each public module is named by something executable.
| Module | Tests | Examples | Consumers |
|---|---|---|---|
colors | 10 | 0 | 0 |
error | 1 | 0 | 0 |
note | 2 | 0 | 0 |
object_tag | 2 | 0 | 0 |
tag | 2 | 0 | 0 |
visibility | 1 | 0 | 0 |
What the tests establish, by name:
test_color_constants—src/colors.rstest_is_valid_hex—src/colors.rstest_normalize—src/colors.rstest_duplicate_slug—src/error.rstest_empty_content—src/error.rstest_invalid_color—src/error.rstest_note_not_found—src/error.rstest_object_tag_not_found—src/error.rstest_tag_already_applied—src/error.rstest_tag_not_found—src/error.rstest_tag_not_found_by_id—src/error.rstest_default_visibility—src/lib.rstest_error_types—src/lib.rstest_metadata_storage—src/lib.rstest_multiple_notes_on_target—src/lib.rstest_note_preview—src/lib.rstest_note_tag_workflow—src/lib.rstest_soft_delete_workflow—src/lib.rstest_system_generated_content—src/lib.rstest_tag_color_helpers—src/lib.rstest_tag_colors—src/lib.rstest_tag_slugification—src/lib.rstest_visibility_access_control—src/lib.rstest_note_builder_basic—src/note.rstest_note_builder_full—src/note.rstest_note_builder_system_note—src/note.rstest_note_can_view_internal—src/note.rstest_note_can_view_private—src/note.rstest_note_can_view_public—src/note.rstest_note_has_id_trait—src/note.rs- _… 39 more_
Documentation coverage
| Measure | Documented | Total |
|---|---|---|
| Public items with rustdoc | 79 | 93 |
Public modules with a //! block | 6 | 6 |
pie showData
title Public items with rustdoc
"Documented" : 79
"No rustdoc detected" : 14
Metrics
| Metric | Value |
|---|---|
| Rust source files | 7 |
| Source lines | 1929 |
| Code lines | 1358 |
| Public API items | 93 |
| Public modules | 6 |
| Tests | 69 |
| Examples | 0 |
| Cargo features | 0 |
| Direct runtime dependencies | 8 |
| Workspace reverse dependencies | 1 |
pie showData
title Public API by kind
"constant" : 8
"enum" : 2
"function" : 2
"method" : 75
"struct" : 6
pie showData
title Rust source composition
"Code" : 1358
"Blank or comment" : 571
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.