Turtle parser (chaipat.cc)
The Turtle parser in src/turtle.js reads the knowledge graph of chaipat.cc from RDF Turtle files. It is small, has no dependencies and is strict, and it is plain JavaScript that runs both in the visitor's browser and in the build scripts, so the page, the prerendered wiki and the CV all read the graph the same way.
It supports @prefix and PREFIX, @base and relative IRIs, prefixed names, a, literals in all four quote styles with escapes, language tags and datatypes, numbers and booleans, predicate and object lists, and blank nodes. RDF collections become rdf:first / rdf:rest chains ending in rdf:nil; the ontology uses them for property-chain reasoning.
Before every deploy the same files are also checked with N3.js, an independent parser, so a file that only this parser accepts would be caught.
Parsing records the graph's meaning; it does not decide what a URL is for. The ontology distinguishes cj:liveUrl (an explicit live product destination), cj:repository (source code) and cj:url (a general related link, which can be a publication or store listing). src/resources.js turns those facts into resource actions and supplies every typed entity except the profile with a local wiki about address. The validator checks external URL safety and at most one live destination and repository per entity. No live resource is inferred merely because a general URL was parsed.
Ontology version 1.14 adds cj:implementationDigest, a string-valued component property generated from declared local source files. It is byte provenance, not a statement that code and prose have the same meaning. data/knowledge-state.json separately hashes the parser, shared answer/resource modules, ontology, graph and wiki sources; validation recomputes those hashes and expected generated artifacts without writing. Parser or ontology edits require rebuilding knowledge and reviewing affected descriptions.
The parser itself does not choose citations. The shared answer composer attaches only the graph, focused wiki passage or Wikipedia extract it actually used to one answer. Related entities are not automatically evidence, live/source actions remain separate, and optional model augmentation must retain authoritative local citations.