concordance build chains (6 passages, no note) its steps (note: Step) in a fixed order and produces one build. Each step is a pure function of the outputs of the previous ones and reports its anomalies as findings; no content anomaly stops the chain. Two build (note: Build)s on unchanged sources (note: Source) produce byte-identical (note: Determinism) files.
Steps
- Validate the configuration (3 passages, no note), read and validate (10 passages, no note) the lock file (note: Lock) it names, merge (27 passages, no note) the profile (note: Profile) and load the declared plugins (note: Plugin); stop on a configuration (note: Configuration) error (29 passages, no note), a missing or invalid (5 passages, no note) lock file, an invalid profile or a plugin that cannot be loaded.
- Ingest every source with cache and without writing anything into the repositories (note: Knowledge repository): a git (24 passages, no note) source is cloned (5 passages, no note) with its whole history (9 passages, no note) and without the blobs, so that the checkout (3 passages, no note) fetches only the files it reads; record for each file the last commit (29 passages, no note) that touched (3 passages, no note) it and its date (44 passages, no note), from the repository holding a local (27 passages, no note) folder too when the file is unchanged since its commit.
- Parse the markdown (note: Markdown) and frontmatter (note: Frontmatter) into sections (note: Section), lists, links (note: Link) and the text units (4 passages, no note) the recognition (8 passages, no note) reads.
- Read every other file a reader (note: Reader) or a converter (note: Converter) of the plugins accepts, in parallel (3 passages, no note): the reader gives its metadata (8 passages, no note) and, for a transcript (note: Transcript), its cues (note: Cue) with their timecodes; the converter gives its PDF (56 passages, no note), cached by the fingerprint of the file, and the text of every page of that PDF, the only text an office document (note: Document) ever contributes. A conversion (note: Conversion) that fails is a finding and the document stays a download (30 passages, no note).
- Read the pseudonymisation dictionary (5 passages, no note) the configuration names and validate it; report (47 passages, no note) a missing or malformed file, as a warning while pseudonymisation (note: Pseudonymisation) is disabled, as an error that fails the build and withholds every transcript when it is enabled (5 passages, no note). Pseudonymise every transcript before typing reads it: the speakers and the text of its cues, the metadata of its reader, and the file offered (3 passages, no note) for download, written back by the reader with the same timecodes; withhold a transcript whose reader cannot write it back, and every transcript unless the configuration publishes (16 passages, no note) them; report the name-shaped mentions (note: Mention) the dictionary (note: Dictionary) does not cover.
- Type (note: Type) every note (note: Note) and every document through the cascade (note: Type cascade), compute identifiers (note: Identifier) (a document keeps its extension), resolve application (note: Application) and domain (note: Domain); produce an entity per note and per document, the metadata of a document as its attributes (note: Attribute).
- Pseudonymise the notes and the documents of the entities (note: Entity) whose type is in the configured scope (note: Scope), the meetings (note: Meeting) by default, with the same dictionary: rewrite the note and parse it again, replace the pages and properties of the document, and the title, aliases (11 passages, no note), summary (24 passages, no note) and attributes of the entity; the rewritten (5 passages, no note) note is what the fragments (note: Fragment) render (24 passages, no note).
- Run the source plugins on the typed entities (4 passages, no note): the contract importers (note: Contract) read the contract each API note (note: API) declares and add its endpoints (note: Operation), their
exposeslinks, the candidate objects (4 passages, no note) and one contract record per contract. - Reconcile the notes and documents (3 passages, no note) that look like twin resources, by declaration (17 passages, no note), base (19 passages, no note) name, the title a reader reports against the heading of a note, or their texts compared without the stopwords (note: Stopword) of the locale (note: Locale): merge the groups (23 passages, no note) above the merge threshold (note: Publication threshold) into one entity with several representations (note: Representation), the note's identifier when it has one, report the pairs (47 passages, no note) above the candidate (note: Candidate) threshold; a pair the lock file merges is one entity whatever its score (note: Confidence), grouped by the criterion (4 passages, no note)
lock file, a pair it separates is neither merged nor reported; report every document left without a markdown representation (5 passages, no note). The reconciliation comes before the dictionary, so that a twin (note: Twin resources) folded into its note never counts as a homonym (note: Homonym) of that note. - Build one recognition dictionary per locale from the titles and aliases of the entities, those of a folded twin naming the entity (3 passages, no note) it became, glossary (28 passages, no note) sources first, stopwords excluded; flag (5 passages, no note) the homonyms.
- Scan every note and every page of every document with the dictionary of its locale and record each occurrence (note: Occurrence) with its line, position (23 passages, no note), section and context (note: Passage); in a document the line is the number of the page, slide or cue (4 passages, no note) and the section its label (44 passages, no note), so that a mention cites (4 passages, no note)
slide 3or a timecode. - Produce the links: written links, frontmatter references (note: Frontmatter reference), mentions in mapped sections and in prose, co-occurrences (note: Co-occurrence) per paragraph (19 passages, no note) with the bounded neighbourhood (note: Bounded neighbourhood); the files of a folded twin declare and receive links under its identifier, moved (6 passages, no note) to the merged entity once the relations (note: Relation) are typed (37 passages, no note).
- Combine the confidences of every link into one link per source, target (5 passages, no note), relation and attributes, every provenance (note: Provenance) kept.
- Type the relations: keep a declared relation the profile allows between the two types and drop the others, name a
relatedlink from its type pair (4 passages, no note) or leave itrelated, capped and reported unless co-occurrence alone knows it. - Discover the recurring expressions (note: Candidate expression) without a note in the notes and in the pages of the documents, headings and section labels left out as titles rather than usage, flag the undefined terms (note: Undefined term) and publish the keyword pages (note: Keyword) above the threshold as entities; the rejected terms (4 passages, no note) of the lock file, compared on their normalised form (note: Comparison form), and the real names of the pseudonymisation dictionary are never proposed (4 passages, no note).
- File under the domains the lock file promotes the notes it names among those no frontmatter, folder or glob (3 passages, no note) files, with the origin
lock; then, when the configuration asks for the emergent domains (note: Emergent domain), walk (3 passages, no note) the graph (3 passages, no note) of the typed links and the co-occurrence neighbours (42 passages, no note) from every term with a note (3 passages, no note) whose degree (4 passages, no note) reaches the threshold, attach every unclassified note within the radius to its closest pivot (14 passages, no note), report each one as a suggested domain and file it under the domain named after its pivot, with the origininferred, only when the configuration assigns; a note with a declared domain is never touched. - Run every check (note: Check) of the registry (11 passages, no note) on the model (note: Model), enrich the findings (note: Finding) of every step with the same registry and sort them once.
- Write the model and the build log, the decisions of the lock (3 passages, no note) file counted in its summary and the suggested domains listed with their pivots, then one fragment per entity (4 passages, no note) next to them: the note rendered to sanitised HTML (3 passages, no note) section by section, its written links (note: Link) turned into page links, its plain text and the text of every page of its documents for the search index (note: Search index), the original file and the PDF of each document kept for the page, a pseudonymised transcript written from its rewritten bytes (17 passages, no note) rather than copied, or the passages of a keyword (4 passages, no note) page. Nothing after this step reads a source.
- Resolve the theme (note: Theme): the components (46 passages, no note) the plugins contribute and the project (note: Project)'s
theme.yaml, whose labels override (3 passages, no note) the message catalogue (4 passages, no note) of the project locale (6 passages, no note). - Render the site (note: Site) from the model, the fragments, the profile and the theme, as
concordance renderdoes alone: the home page, one page per entity and per keyword page at the address (56 passages, no note) of its identifier, the document viewer on the page of a document with its files placed next to it, the alphabetical index, the to-do page, the search index and the assets (5 passages, no note), every link relative to its page so that the site works overfile://. - Measure (6 passages, no note) every page against the 150 kB budget (20 passages, no note) and run the static (22 passages, no note) accessibility checks (note: Accessibility audit); print the pages written, the size (12 passages, no note) of each island (note: Island) bundle (12 passages, no note), the largest page and the findings, as warnings that never fail the build.