Repository navigation
Merge the package conventions companion repository into the template - #17
Conversation
|
I compared the shipped skills against the conventions repository this PR merges. Almost everything carried over, and dropping the per-package evidence is well argued. Three things before this merges: 1. The dirty-tree warning was lost ( The section gives the 2. The namespace-dependency rule ships to packages that cannot follow it (
— which agrees with the Vocabulary packages are asked no dependency questions decision. (The published schema at 3. Two editorial slips
|
Four findings from the review of the conventions merge, all in the shipped skills: - `package-content` now says to commit before `task build`. A dirty tree makes `git describe` append `-dirty`, so the archive is named for a state that lives on no commit and can never be rebuilt. Nothing else stops it. - the namespace-dependency section is scoped to project packages. The skill is not conditional, so vocabulary packages read it too, and `cmemc` rejects a vocabulary manifest carrying any dependency - which is the existing deliberate decision, seen from the build side. The published manifest schema does not express the restriction, so `manifest_check` does not catch it. SKILL.md is not Jinja-rendered, so the scoping is prose rather than a conditional block. - `build-projects` had the export command twice in a row; the stray second block is gone. - the last bullet of *When to prefer the computed binding* carried two statements under one heading, and its heading contradicted its last sentence. Split back into keeping the echo where no hop is defining, and recording which hop was wrapped where one is. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018zcpmL3gB5z2RvTMjrmoow
There was a problem hiding this comment.
Approved. The three points from my earlier comment (#17 (comment)) are all addressed in 3e98d15: the dirty-tree warning is back in package-content, the namespace-dependency section is scoped to project packages, and both editorial slips are fixed. Ready to merge.
Further platform findings from the home library and variant config packages will come as a separate follow-up PR after this one merges.
|
LGTM as well |
Merges the
eccenca-marketplace-packages-conventionscompanion repository into the template. The conventions become shipped skills, and the checker toolkit becomes something every generated package runs.The companion repository is not referenced from anywhere in the template, so it can be archived without leaving a dead link.
What generated packages get
bin/— five offline RDF checks. No Corporate Memory connection, no credentials, no install. They carry PEP 723 inline metadata and auv run --scriptshebang, so there is no install step and no Python project in the generated repository.check_dangling.pysh:property/sh:node/sh:group/sh:sparql/shui:valueQueryreferences that point at nothingcheck_placeholders.pycheck_paths.pyshacl:pathagainst the vocabulary, forwards and undershui:inversePathaudit_queries.pycheck_all.pytask check:offlineruns them.task checkandtask importboth run it first —importbecause that is the task that puts a catalog on a live instance, where a dangling reference makes the SHACL service answer HTTP 500 for every graph on the deployment.Two new skills, bringing the shipped set to six:
vocabulary(all package types) — predicate order, theskos:definitionsubstitution principle and what belongs inrdfs:commentinstead, head-final class names, classifying by intention, plus a reference on thefoaf:depictionevery class wants.catalog-queries(project packages) — which column Corporate Memory takes as the value, why a projection variable may not be capitalised, how to document a query, with references for placeholders and the?graphcolumn.Existing skills extended —
package-contentgains graph ownership (listing a graph is what makes uninstall clean) and a four-graph architecture reference;shapesgains cardinalities, slugs,shacl:namevsrdfs:labeland apaths.mdreference.What this means for the fleet
Nothing changes for any package until somebody runs
copier updateon it. When they do:27 of 35 packages are unaffected. They ship no shape catalog — almost all are vocabulary packages — so every check is a no-op and
task check:offlinepasses with a note.Of the 8 packages with a catalog, 2 pass and 6 go red. Measured by running this branch's checkers over the fleet as it stands today:
ecc-northwind-project-packageecc-filesystem-vocab-packageecc-supply-chain-risk-project-packageecc-police-demo-project-packageecc-product-data-project-packageecc-useful-queries-package58 blocking findings, 286 warnings. Every blocking finding names something that is actually wrong:
?resource, or the first projected variable when?resourceis absent — a capital defeats that selection and the row renders the wrong value.shacl:paths that are not type-correct, each one silently disablingshacl:class,shacl:nodeKindand every cardinality on its row.Why most findings only warn
The first version of this branch failed on everything the checkers report. Run over the fleet, that turned 7 of 8 catalogs red out of 229 findings, 186 of which were documentation — and one package failed with nothing actually wrong with it.
The largest single cause was "built-in key has no placeholder declaration", 63 findings. That flags nothing broken:
{{shuiResource}},{{shuiMainResource}}and{{shuiGraph}}are substituted by the form renderer from context whether or not a placeholder exists, so the declaration only makes a query runnable in the query editor. Across the whole fleet 1 file declares aQueryPlaceholderwhile 7 useshuiResource— it was failing packages for not adopting one package's optional editor aid.So the split is: fail where something is broken, warn where prose is missing. A missing
dcterms:description, a header that does not list the projection, and an undeclared built-in key all print as warnings. An undeclared custom key still fails, because nothing would ever substitute it.What a maintainer has to do
For the 6 red packages: rename the capitalised projection variables, move the placeholder keys out of comments, give the value queries a literal graph, and fix the four paths. The warnings can be worked through at leisure — they do not gate anything.
Nothing forces the update. A package stays on its current
_commituntil somebody chooses to move it.Two bugs found while surveying the fleet, and fixed here
.ttlno parser accepts was skipped, not failed.cmemc package buildignores RDF syntax entirely, so this was precisely the gap the gate exists to cover. Now a failure, raised before the no-catalog pass, so a package whose only catalog is unparseable cannot slip through as "nothing to check".shui:SparqlQueryclassified as neither shapes nor vocabulary and was skipped. This cut both ways:ecc-useful-queries-packageships 14 queries and no shapes, so the two checks that are entirely about queries never ran on the one package built to hold them; and inecc-product-data-project-package, where the query texts live inpdd-queries.ttland the shapes inpv-shapes.ttl, the shapes' query targets looked textless — a false positive, now gone.What was deliberately not merged
The source document carried the evidence that proved its rules: a
FROM/FROM NAMEDmeasurement table against one package's 1526-triple data graph, counts such as "19 features and 200 materials", a rejected colour pair, and two findings whose cause was explicitly never established. None of it migrated.The test is whether a reader can reproduce it in their package. Evidence about the platform stays — "0 of 236 paths in eccenca's own system catalog are blank nodes" is the same category as the existing "21 of its node shapes use
rdfs:commentand one uses the other". Evidence about one package's data does not. Unresolved questions were dropped outright.This is recorded under Deliberate decisions in
CLAUDE.md, so it does not come back as a review comment.Verification
task checkpasses end to end againstdocker.localhost: build →install --replace→ uninstall, both test cases, exit 0.check:offline:casedrives the rendered package's ownbin/overtests/fixtures/goodandtests/fixtures/bad, and requires each checker to catch its own planted fault by name. An exit-code assertion alone would be satisfied by one checker failing while three others had gone blind — verified by blindingcheck_dangling.py, which the exit code alone does not catch.check-skills.pyand the shippedStophook know aboutbin/and both new skills;catalog-queriesis asserted absent from a vocabulary package.🤖 Generated with Claude Code
https://claude.ai/code/session_01EvKf2rhUMK7hSorGsaVQz8