Develop - #60
Merged
Merged
Develop#60
Conversation
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C17WzuUXBuyAxZ3nQASCNg
- Line items table on order pages via forward ldh:view (detail gallery) - Order status (OrderDelivered/OrderProcessing/OrderProblem) derived from shipped vs required date; shipped date and freight re-emitted - Line item extended prices (schema:totalPrice) computed from the existing quantity/unitPrice/discount columns - Orders gallery first on the container page, newest-first, with customer/broker/date/status columns; narrative blocks rewritten; buggy sales-by-region chart (duplicate ldh:seriesVarName) removed - Inverse views upgraded to TableMode with richer columns; new "Orders shipped by this shipper" panel; showWhenEmpty false - KPI row (orders/revenue/avg order value) on the root dashboard - Fix unbound ?deliveryLocation triple in orders.rq The source CSVs stay stock Northwind - no orderTotal or productName columns are added. An order total is the sum of its line items and a product name lives in products.csv, so neither belongs in the source data; the row-at-a-time importer cannot aggregate or join, but that is a constraint to design around rather than to denormalise away. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C17WzuUXBuyAxZ3nQASCNg
Page structure and copy: - Drop the frontpage block advertising LinkedDataHub's features and the low-code build story; an app does not explain its own toolchain - Lead the dashboard with the monthly sales trend instead of a two-value table stretched over the 400px chart canvas - Record lists come before analytics in each container, so a section opens on its data; narrative blocks run between sections throughout - Give the four reference containers (suppliers, shippers, regions, territories) the intros the others already had - Drop the revenue-by-category chart duplicated in products.ttl; it belongs to categories.ttl Labelling: - dct:title on every ldh:Object block. Without it the block heading renders the fragment identifier, so pages showed "kpi-block", "select-suppliers" - Northwind's own vocabulary in the ontology: Sales rep (not Broker), Reports to (not Sponsor), Territory, Region, Company name, Required by - Use .ldh-section for section headers; page-header/lead are Bootstrap 2 leftovers with no rules in the current design system Correctness: - Revenue charts are now net of schema:discount. They summed quantity x price and overstated by 6.7% (1,297,141 gross against 1,215,813 net), so no chart reconciled with the order totals - No hardcoded counts in prose. "all 830 orders" was also wrong: 19 rows are dropped at import because shipPostalCode is empty and the mapping requires it - Exclude the final, incomplete month from the trend. The data stops on 1998-05-06, which rendered as a collapse rather than a truncated month; the cutoff is derived from MAX(?orderDate), not pinned to a date - Order-scoped schema:totalPrice is no longer required by any query, following its removal from the import mapping Charts: - Add revenue by carrier to Orders, the first chart here with multiple series. Each ldh:seriesVarName names its own measure column, so the query pivots with conditional aggregation; the removed sales-by-region chart passed a label column plus a value column, which is why it never rendered Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C17WzuUXBuyAxZ3nQASCNg
The checker maps every .ttl to <path minus .ttl>/, which is right for containers but wrong for root.ttl: install.sh PUTs it at $base itself, not at <dir>/root/. So a relative link in a root.ttl resolved one level too deep, and demo/northwind-traders/root.ttl's href="orders/" was reported as demo/northwind-traders/root/orders.ttl. No root.ttl carried a relative link until now, which is why this went unnoticed. The link is correct at runtime; the checker's base was not. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01C17WzuUXBuyAxZ3nQASCNg
Several schema.org properties were carrying values outside their declared domains. Each is moved to the term the vocabulary actually provides: - Order lines are now schema:OrderItem *and* schema:Offer. schema:OrderItem has no price properties at all, so schema:price/schema:priceCurrency were off-domain; typing the line as the offer that was accepted for it makes them legal without splitting the line across two nodes. - schema:Offer's own schema:price is the price of the offer as a whole, so it replaces schema:totalPrice (a Reservation/Ticket property) as the line total. The historical unit price moves to a schema:UnitPriceSpecification with schema:priceType schema:ListPrice. - schema:discount is dropped. It is an Order-level property in schema.org, and the list price, quantity and line total already pin the per-line rate exactly - unlike a stored rate, they cannot disagree with each other. - Product prices move from schema:Product to a schema:Offer reached through schema:offers. A product is not an offer, so this one needs its own node. - Freight moves off schema:ParcelDelivery, which has no price property, onto a schema:DeliveryChargeSpecification reached via schema:priceSpecification from a shipping schema:Offer. - The dispatch date moves off schema:availableFrom (a DeliveryEvent property borrowed onto a ParcelDelivery, and meaning "available for pickup" rather than "dispatched") onto a real schema:DeliveryEvent hanging off schema:deliveryStatus. Orders never dispatched get no event at all. - schema:orderedItem loses its rdfs:domain/rdfs:range. schema.org allows Order|OrderItem -> OrderItem|Product|Service, which a single domain/range pair cannot express; the narrowed pair entailed every OrderItem is a Product. Also fixes a pre-existing import bug: shipPostalCode sat in the required BGP but 19 orders have none, so those orders never entered the graph at all. Making it OPTIONAL restores them, taking the import from 811 to 830 orders and revenue from 1,215,812 to 1,265,792 - the canonical Northwind figure. Consuming queries follow the new structure. The six revenue queries drop their ?quantity * ?price * (1 - ?discount) recomputation for the materialised line total, which also settles a 0.1 discrepancy between the carrier chart and the rest. SelectProductsFromSupplier traverses schema:offers/schema:price. Verified by running all eleven import queries over the real CSVs and all 28 view and chart queries against the resulting graph: 830 orders, 2155 lines, freight totalling 64,943, and top product/employee/customer/category all matching canonical Northwind. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYifJzEkGsTcJsuB4fGRAc
…and orders pages The schema.org remodelling added facts the content blocks were not using: per-order status, a materialised line total, the catalogue price each line was struck against, and a DeliveryEvent carrying the dispatch date. Four new charts read them, each with a narrative block ahead of it. Front page gains a discounting section. Revenue is what was billed; the ListPrice specification on each line is what was listed, so the gap is what was given away to win the deal. As a share of gross it runs 3.6%-11.2% and is decorrelated from volume, which a revenue chart cannot show. Orders page gains a fulfilment section - average days from order to dispatch, and the share of orders that beat the date the customer was promised - plus a late-shipments-by-carrier bar alongside the existing revenue-by-carrier line, so carriers are compared on reliability as well as volume. "Orders by country" is dropped to make room. The front page already tells the geographic story in revenue rather than order count, which is the more useful of the two measures. Both rate charts are normalised on purpose. Raw monthly status counts squash the late series (0-4 a month) against a delivered series climbing 21 to 69, and the 21 still-open orders are a dataset-cutoff artifact confined to the last two months - they are filtered out of the on-time and late rates, since not yet dispatched is not the same as delivered late. Also corrects the orders intro, which still promised unit prices in the line-items table; those moved to a nested UnitPriceSpecification. Verified against the full graph built from the real CSVs: 31 view and chart queries, none failing to parse, none returning no rows. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYifJzEkGsTcJsuB4fGRAc
customers.rq required <#postalCode> in its main BGP, but HUNGO — Hungry Owl All-Night Grocers, Cork — has none. Ireland had no national postcode system until Eircode in 2015, so a 1996-98 Irish address legitimately has no postal code; this is correct data, not dirty data. The row processor emits no triple for an empty cell, so the BGP failed to match and the entire customer was silently discarded - company, contact, address, phone and coordinates alike. Its 19 orders kept their schema:customer link, which then resolved to nothing. Moving the column to an OPTIONAL, alongside region, fax, lat and long in that same query, restores the customer and takes dangling customer references from 19 to 0. HUNGO imports with its city and no postal code, rather than a fabricated placeholder. Same failure mode as the 19 orders dropped on an empty shipPostalCode. An audit of all eleven mappings against their CSVs confirms these were the only two required-but-sometimes-empty columns. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SYifJzEkGsTcJsuB4fGRAc
- command-line-interface: rewritten for the ldh executable — build and PATH setup, PKCS12 keystore auth, LDH_* environment defaults, stdout and exit code conventions, the command table (#scripts is now #commands) and a deprecation note for the bin/ HTTP API scripts - every page that invoked a script now invokes a command: upload-file, create-documents, create-content (--fragment is --uri), import-csv/rdf, change-model (create-construct.sh etc. never existed — they are ldh admin ontologies add-constructor/add-class/add-property-constraint) and the data-model CLI tables - manage-packages / administration/packages: packages are installed by declaring one ldh:import triple, composed at request time; drop the Actions dropdown, the packages/install endpoints and the docker-compose restart step - http-api: drop the removed package endpoints, document the settings endpoint, and correct the container hierarchy predicate to sioc:has_parent - admin app URLs use the admin. subdomain, not an /admin path; examples use localhost:4443 and a single example agent URI throughout - get-an-account: the CLI reads the .p12 keystore directly, PEM is only needed for curl Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014Tgf5DjbYiX3SPnCFSgCzd
The multi-stage Docker example built the WAR overlay on maven:3.8.4-openjdk-17, which cannot compile against a Java 21 platform - and the same page already told you to target Java 21 ten lines further down. The build stage now matches the platform's own Dockerfile. The pinned versions were stale in the same way: the base image at 5.3.2 and the overlay dependency at 5.5.3, both now 5.9.1, the current release. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014Tgf5DjbYiX3SPnCFSgCzd
Present Northwind as a business application, and fix its schema.org modelling
Merge the duplicated pages into their parents (content blocks, documents, resources, browse data), collapse the static ToC to the active trail, and fix every broken anchor. Add the versioning reference and the version-history guide; document the Memento options of ldh get, federation through the Linked Data proxy, and UI language negotiation. Sync the reskinned UI descriptions, the ORCID login, the fuseki/ data directory and the make up/drop targets. Import the tutorial from the docs-tutorial branch and migrate all of its examples from the deprecated bin/ scripts to the ldh CLI. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WK1ssk2A67MYseeH3hWnhf
The generated pages link the vendored design-system stylesheets (fonts, tokens, components, m3 skin, ldh-bridge) plus a docs-specific skin, and drop Bootstrap 2 and jQuery. The shell mirrors the app's: the sticky ldh-header carries the landing page's navbar content (version picker, sample applications, GitHub and social buttons), and the ldh-footer matches the app's footer. ttl-to-html.sh copies the CSS and fonts from a local LinkedDataHub checkout (LDH_SRC) or fetches them from GitHub (LDH_REF, default develop - flip to master once 5.11.0 ships). The UI/CLI tab strips run on vanilla JS; the rsync excludes now keep *.xsl and *.css out of the published files/ tree. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WK1ssk2A67MYseeH3hWnhf
docs/ and packages/ sit one level deep in the repository, but their Makefiles defaulted the owner certificate three levels up - pointing outside the sibling LinkedDataHub checkout, so accepting the make install defaults failed on realpath. The demo apps sit two levels deep and their three-level default is correct. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WK1ssk2A67MYseeH3hWnhf
One dataset runs through the whole documentation now: the examples that used SKOS concepts, countries CSV, Places, Friends and DBpedia all draw on the Northwind Traders demo instead, sourced from the demo app where an exhibit exists and linked to its file on GitHub and the live resource on northwind-traders.demo.linkeddatahub.com. The tutorial conforms to the demo: the revenue query sums the line totals the order-details mapping already computed (the old one multiplied quantity in twice), the composition sequence matches root.ttl, employees link portraits with foaf:img, and the dangling query and block references are defined. The demo grows the two pieces the docs lean on: a schema:Product constructor and missing-name constraint in ns.ttl, and categories/unesco-mappings.ttl mapping the eight categories to UNESCO Thesaurus concepts - the RDF import example and the seed of the cross-dataspace federation thread. The exhibit-starved pages get their first exhibits: an acl:Authorization and access request, the PATCH accepted/rejected pair, the PROV-O TimeMap with its link-format and Memento exchanges, the northwind-traders dataspace quoted from config/*.trig, and the stylesheets reference gains the full global parameter table, the author-facing function tables, and an input/output template pair. Every runnable SPARQL exhibit was executed against the live demo endpoints; screenshots are placeholder comments pending capture. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WK1ssk2A67MYseeH3hWnhf
The screenshot comments and the remaining Bootstrap-era media - six YouTube embeds, four webm recordings and eleven screenshots - become visible placeholder blocks: a dashed box with an image or play_circle glyph and a caption typed "Screenshot:" or "Screen recording:" that describes what the capture should show. The placeholder blocks are the shot list, in place; the orphaned media files are removed. Also corrects the Condiments pictureHash in the tutorial's CSV excerpt to the file's real content hash. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WK1ssk2A67MYseeH3hWnhf
The Resources reference and the Query data guide each carry an actual query block - an ldh:Object over an sp:Select bound through ldh:service to an sd:Service pointing at the Northwind Traders demo's SPARQL endpoint. Rendered in a LinkedDataHub instance, the block hydrates with the service picker and editor, and Run executes against the remote dataspace; the documentation demonstrates the platform inside itself. The static site renders such blocks as an "Interactive block" stub in the placeholder style instead of dropping them silently (the children view stays suppressed - containers list their children separately). These two pages' media placeholders from the preceding sweep ride along. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WK1ssk2A67MYseeH3hWnhf
…ioms, a fuller function reference Tab groups move from the dead Bootstrap tabbable markup to the design system's ldhc-tabs component with ARIA roles and hidden-gated panels, on all eight pages that use them; the static site's tab script follows. The customization guides drop retired forms - $ac:uri patterns become ac:absolute-path(ldh:base-uri(.)) - and the stylesheets reference gains ac:uri() and eight more public functions (label helpers, sort companions, ldh:link-targets, ldh:hash-code, value-set utilities) grouped into a new Utility table, with the closing note honestly covering everything left internal. Editing docs describe the dirty-gated autosave (no edits, no save, no version) and the tab-group limitation: panels edit in place, stacked while editing, but creating a group still takes the HTTP API. Guides move from user-guide/ to extending/, and prose gets a wording pass. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S1UnYpbW5aYLj7LbwtyUo1
Seventeen docs pages that presented mutually exclusive paths as sequential headings now use the design system's tab groups: the reference Management sections (UI/CLI pairs in data-model and versioning), the user-guide pages whose CLI content trailed as a final heading (add-data's three sources, version-history, create-resources), the triplestore authentication methods (HTTP Basic / Bearer token), the authorization example in RDF and CLI form, and the eight tutorial stages' in-the-browser/command-line pairs (insight's CLI path is its chart+view walkthrough, kept whole as one panel). The copenhagen and unesco-thesaurus demo apps shed their dead Bootstrap markup (page-header/lead, and unesco's collapsed row-fluid/span grid) for the ldh-section idiom, and gain tabs where their content branches: the copenhagen feature run-on becomes a five-tab tour with links into the app, unesco's usage-path dl becomes Browser/Editor/RDF Import (the import panel now names skos-import.rq), and the concepts intro's relationship list becomes Hierarchical/Associative/Matches with the live Northwind category mappings as the matches example. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S1UnYpbW5aYLj7LbwtyUo1
The tutorial's ten stages, setup's make targets, the Data stage's four BIND variables and the annotation dialog's fields were all parallel term-dash-description list items; each is now a striped table in the reference pages' idiom (the dialog's advanced fields keep their own table under the expander sentence, replacing a double-nested list). See-also lists and prose-heavy routes stay lists - they enumerate reading paths, not facts. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S1UnYpbW5aYLj7LbwtyUo1
The Resources reference contrasted two SELECT queries by padding them into a single pre with spaces, so the pair read across the page instead of down it and neither query could be copied on its own. They are now two pre elements, each introduced by the sentence that says what it does; the "# renders category documents" / "# renders nothing" comments go, since the prose already carried them and their absence leaves the queries paste-ready. A sweep of the corpus for pre blocks with a second column of content turned up no other side-by-side pair - the remaining multi-column blocks are directory trees, aligned PREFIX declarations and end-of-line comments, all single examples. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YxhcqMPK1kZR1pxxJqoge
Twenty-eight rdf:XMLLiteral lexical forms across the docs were not exclusive-canonical XML. Forty-four screenshot-placeholder spans wrote class before aria-hidden, and the stylesheets reference's wrapped function signatures used self-closing <br/>; canonical form wants attributes in alphabetical order and explicit end tags. RDF 1.1 makes canonical form the datatype's lexical space, and Jena 4.7.0 - which the Check Docs syntax check pins - enforces it while validating. The workflow runs under bash -e, so it aborted on the first offending file and reported only about.ttl. Jena 5 and later dropped the canonicalisation check and validate well-formedness alone, which is why make validate stayed green locally the whole time. Each literal is now its own xmllint --exc-c14n serialisation, so the change is confined to attribute order and empty-element tags; no whitespace, text or namespace moved. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YxhcqMPK1kZR1pxxJqoge
check-xmlliterals.sh extracts every """..."""^^rdf:XMLLiteral lexical form, canonicalises it with xmllint --exc-c14n and diffs the result, reporting file:line and the offending lines. Run against the tree as it stood before the preceding commit, it returns the same verdict as Jena 4.7.0 on all twenty-eight offenders, with no false positives - so the rule survives independently of which Jena is installed. validate-documents.sh calls it after the riot pass, giving make validate a check that can actually fail. Check Docs runs it as its own step, which lets the syntax check move from the action's implicit 4.7.0 default to Jena 6.1.0 without losing the rule; Jena 6 needs Java 21 and the runner defaults to 17, hence the setup-java step. The check assumes each literal is a single-rooted fragment, which all ninety-five are, and compares the Turtle-escaped text - sound here because the corpus's only escape is \\, which canonicalisation leaves untouched. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YxhcqMPK1kZR1pxxJqoge
The matches tab pointed at concept3683/, concept1812/ and concept3495/ relative to the concepts container. Those documents are real once the app is installed - skos-import.rq constructs them from the thesaurus RDF - but they are never files in the repository, so check-links.sh, which resolves relative links to checked-in .ttl files, could only report them broken. The three now address the public demo instance, in the same form the Northwind mappings and the reference docs already use, and carry target="_blank" like the app's other absolute links. This surfaced only now: the RDF syntax check used to abort the Check Docs job before the link step ever ran. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016YxhcqMPK1kZR1pxxJqoge
Faceted search and parallax are rewritten around the view's control header: facet pills in a toolbar at the top of the view, loading their values with result counts on first open, and a chip row below it whose pivots are discovered by querying the whole result set in both directions - outgoing properties of the results and properties pointing at them. Applied steps read via/linked by next to the facets, and removing one rewinds the view to that step. The action bar section describes the three zones: Create and Add on the left, breadcrumb pills with document-type icons and the last-modified timestamp in the middle, and the Actions, layout-mode and export dropdowns on the right. The settings menu moves to the navigation bar section, where the button now lives. The guides that pointed at retired placements follow: Edit/Delete/Save as go through the Actions dropdown, File/Query/Import creation goes through the creation bar at the bottom of the page (the action bar's Create only offers Container and Item), and the editor toolbar mounts below the action bar. The right sidebar section becomes Backlinks: every block whose resource has a URI carries its own links popover, loaded on first open - in Properties mode that is one per resource in the document. The block data model sheds the left/main/right column convention for the card description, and the left sidebar is documented as the flyout it is, with the stale narrow-screen claim dropped. Graph-scoped updates state the PATCH contract: a single update operation, in the DELETE/INSERT-with-WHERE form or the DELETE WHERE shorthand, everything else answering 422 - matching DocumentHierarchyGraphStoreImpl. The hand-written "On this page" lists in the HTTP API and stylesheets references are dropped along the way. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WK1ssk2A67MYseeH3hWnhf
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S1UnYpbW5aYLj7LbwtyUo1
…syntax Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01S1UnYpbW5aYLj7LbwtyUo1
$ldt:ontology, $ac:forClass, $ac:query and $ac:googleMapsKey survive in client.xsl solely as Web-Client compatibility leftovers, and $ac:method and $ac:httpHeaders are server-side layout internals - none of them is part of the contract a custom stylesheet writes against. The bs2:Form entry drops its $ac:forClass condition along with them. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011j6GapYTmxZXEq3YK2Z53D
The dataset holds the current version of every document and nothing else, which the versioning reference now states next to the read-only notice rather than leaving readers to infer it from the Git-backed storage. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011j6GapYTmxZXEq3YK2Z53D
…er than the frame, so the drag's result - the sentence landing under the chart - was off screen until a scroll after the fact. The compose scene now zooms the document out to fit the two rows before the drag beat opens, from their measured height and floored at the natural size, at the beat boundary where the cut lands; the drag helper skips its pre-release scroll when the target's bottom edge is already in view, and the beats after the drop frame both rows rather than one. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…behind a toggle, so the reveal helper treats a block head without a controls toggle as a block with nothing to reveal, rather than a failure - the compose scene's chart beat runs on such a block, and the first re-recording stopped there. Its beat note names the chart type again, and the "controls opened" beat is marked only when a toggle was actually pressed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…t was created before the first shot and removed after the last, so every root listing and document tree captured in between showed a "Documentation shots" folder the demo does not have; three published stills and three clips carried it. Shots that write now run last, the container is made only when the first of them comes up, and it is called Drafts, since the clips that write inside it show its name in the breadcrumb and address bar and a folder named after the rig is not something a reader should meet. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ed. The document's ETag differs per representation and the write's precondition is checked against whatever the PATCH's own Accept selects, so the tag the client read as RDF never matches; only a Turtle tag with a Turtle Accept is accepted, measured by replaying the client's PATCH under every pairing. The probe that measures it is kept, and it settles the other question on the way: a real pointer drag does reach the app's handlers on this build, marker and drop alike, so the synthetic DragEvents on the supercut branch are no longer needed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…m the master by one pass, make hero and make supercut: the browser chrome and the master's old caption strip cropped away, and captions laid over from hero.json, each rendered in the browser in the platform's own Geist since this ffmpeg has no text filter, timed on the master's timeline so a cut can move without retiming every line. The captions name the LinkedDataHub feature on screen, never the demo's subject. render/camera.mjs cuts a shot from a raw take with a keyframed zoom and pan: eased moves, paced first at full size with the keys remapped through the pacer's marks so a move never speeds up over a still page, a floor on how short a move may come out, an end hold for a closing caption, and a scroll splice for a take that really does jump - measured, since the compose take's scroll turned out to be smooth. The query-to-chart and content-mode passages of the supercut are two such shots; their keys are under camera/. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…the constructor gained three. Two stills and one clip show the form: the form itself in the create-resources guide, the same form with the Missing schema:name violation in the change-model tutorial, and the clip that carries a new product through to Save. All three are re-taken against Northwind reinstalled with the aligned constructors, and the three references follow the new bytes. The clip missed on the first take. The dock's Create button is fixed at the bottom-right corner, which on a page as short as the scratch document is exactly where the form's Save bar ends up once the longer form has pushed it below the fold; the cursor only glides to a target that is off screen, and Save was on screen, under the dock, so the click opened the Create menu and nothing was saved. The clip brings Save to mid-viewport before the click now. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…he aligned constructor added. The master is rebuilt from a new graph take, recorded after Northwind was reinstalled with the constructors matched to the imports, joined to the query-to-chart and content-mode passages cut this afternoon. The graph passage runs 0.4 s longer, so every caption and cut in both edit lists is moved onto the new timeline: a time keeps its offset within the shot it sat in. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…on form the aligned ontology writes. Selecting a node discarded the point approach() had proven by hover and re-aimed at the projected centre, where a nearer node or a label sprite takes the hit: on the customer node the panel showed an OrderItem three times in a row, and the take stopped at 1b. The proven point is the one clicked now; the projection is the fallback for an unproven approach. The view's count moved out of the toolbar band into the block's status line when the band became one that waits to be asked, so the scene read "?" and every wait on the count ran its twenty seconds. The count comes from the status line now, and the refresh wait after Save gets its two arguments as the one array Playwright passes. The territory opened is whichever the engine lists first: the 31 the reps cover are paged twenty at a time, and Rockville, first on the 19th, was not on the page. The hire's copy and the beat notes name the territory opened rather than Rockville. The 1d shot started at a second on the old take's timeline; it sits at the same distance before 1b-end on the new one. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…opens Rockville. The previous rebuild joined the new shots to the query-to-chart and content-mode passages by copy-concat across two timescales, 1/90000 and 1/15360, and the container claimed 45 seconds: the cut everyone saw at the join. The passages are remuxed to the shots' timescale first now, without re-encoding, and the master decodes end to end. The territory shot carries the page turn to Rockville, so the graph passage runs 2.6 s longer and every caption is moved onto the new timeline again, keeping its offset within its shot. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…nd is recorded dark. Rockville is Peacock's, and the cut has always opened it; the 31 territories the reps cover are paged twenty at a time and it sits on the second page since the reinstall. The scene turns the page with the view's own Next until the row is there, and falls back to the first row only when no page has it. The take is recorded with SCHEME=dark like every take in the dark cut, which the previous commit's take was not. The 1d shot start follows the new take's 1b-end. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A `slide` in the edit list renders a card in the platform's own type and dark tokens - Geist and Geist Mono from the platform's font files, the wordmark's mark, the surface, aurora and dot pattern, the eyebrow, headline, lede and pill treatments as the design system sets them - and carries the site's messaging rather than the demo's subject: the eyebrow, "The application is data." and its lede, the two addresses as pills, the licence as a note. The card is rendered in the browser at the output's exact frame size, like the captions. The footage holds its last frame while the card's alpha fades in over it, then the card holds; the hold goes on before the captions are laid, so the last caption ends where the footage ends rather than riding the held frame into the fade. The hero loop is untouched: it sits beside the same headline on the front page. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… as her image, and the territory's grid re-read with her face. After the grid has one face more, the take opens her card, drags a portrait over her document until the drop overlay is up, drops it - the upload lands as a resource of the document, embedded - then edits her, picks the upload in the Image lookup the constructor put on the form, saves, and goes back to the territory by her own Territory link, where the grid shows her face; the breadcrumb up to Sales territories follows as before. The file crosses into the page as base64 rather than an array of bytes, which cost seconds of dead air. The block the save renders back labels its rows by local name and shows the territory link as "this" (measured 2026-09-28), so a load of the document precedes the beat and the save's settle is short. The drag shot starts three seconds before the drop beat, where the overlay is up - it takes some eight seconds to come up after the drag begins - and is framed full width, since the overlay sits at the viewport's centre, outside a frame held on her block. The portrait is a fixture, not demo data. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…cked as her image, the grid re-read. Three captions cover the five new shots - the drop and upload, the pick as a property value, the territory's view reflecting it - and every caption after them moves along. A caption that ended on a shot boundary now ends with the shot before that boundary, so the form's caption stops where the form passage stops rather than stretching over what was inserted after it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Fifteen of the seventeen were fragments in the shapes the book's prose rules ban: a noun phrase
with a participle hung off it ("A form, generated from the class."), a staccato pair ("Click a
node. Its document opens."), a colon-labelled fragment ("Related results: the resources these
link to."), a bare noun phrase ("An XHTML block."). Each is now one sentence with its subject
and verb up front, at most 56 characters so it still sits on one line. The site's own headline
stays as it is.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…eant one. The slide's lede is the front page's, and both said the app is live for the thing a folder of Turtle deploys; that is a dataspace, as the vocabulary names it. The repository notes switched to dataspaces in their first sentence and kept "every app" in the second. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
An `audio` in the edit list lays a track under the cut, padded with silence or trimmed to the output's length and faded over its last fraction of a second so a track that stops on its own cut does not click. The track is kept beside the rig, since the cut is not reproducible without it. The hero loop stays silent. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The front page plays it under the browser's own controls now, so a silent loop would leave the unmute button with nothing behind it. The 1280-wide render of the same cut, with the audio and the slide, is 9.8 MB, which fits the deployment's 16 MiB request limit that the 1440-wide supercut, at 17.9 MB, did not. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…d block controls. Both takes are new, dark, the compose take first so its chart counts the reps the sentence names. The camera passages keep every key's zoom and centre; only the times move, each onto the same beat of the new take at the same offset, and the passages are cut with the settings the originals were: from 8.99 to 49.107 paced at 3, and from 48.916 to 77.588 paced at 2 with a 2.5 second hold, recovered by re-cutting the old take until the durations matched to the frame. The captions move onto the new timeline the same way, inside the passages by their paced beats. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ore the last two commits: the categories grid in the data and insight tutorials and in the create-content guide, Andrew Fuller's portrait in the media tutorial, and Nancy Davolio's drop in the upload-file clip. They are re-shot against the dataspace as it renders now, and the sources point at the new content hashes. The packages reference still is not re-shot; its page needs the taxonomy package and the UNESCO mappings on the instance, which this stack does not have yet. Two changes to the rig went in with it. A shot that writes now gets its scratch container only when it comes up, and write shots go last, so a root listing captured earlier in the same run cannot show a folder the demo does not have; the container is called Drafts, since its name is in the breadcrumb and the address bar of every shot taken inside it. And the scratch document was created under the wrong URL: the container was handed to the CLI without its trailing slash, which concatenated to /draftsupload/ rather than /drafts/upload/, in plain view in the clip. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Supercut: the camera-driven cut, its scenes, and the scenes brought up to the current UI
… the Beverages GIF. Its page needed the categories set up as concepts on the instance, and the taxonomy package's constraints want more than the mapping file in the demo carries: a concept without skos:prefLabel or skos:inScheme is rejected with a 422, so each category got its name as the preferred label and the Categories container as its scheme along with the mappings, rewritten to the local thesaurus origin. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
# Conflicts: # screencast/FINDINGS.md
…ic on the grounds that the registry is public data, but nothing made it so: every anonymous request got a 403, including the ones a dataspace sends when it dereferences an imported package's descriptor, ontology and stylesheet. It now creates the public authorization before pushing, as the docs installer does. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…on its own, capped at the viewport, and a large scheme puts the open concept thousands of pixels down: Denmark sits some 6,000px into the UNESCO Thesaurus tree, where nobody would find it. Once the concept is marked, the tree centres its first occurrence - centred rather than at the top edge, so its parent and siblings stay in view - and only when it is not visible already. It sets the tree's own scrollTop rather than calling scrollIntoView(), which would scroll the page too, and re-decides on every branch of a polyhierarchy, so it settles on the first occurrence whichever branch finishes last. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…es come from the rig. The bin/ scripts it deprecated are gone, the docs media flow gains its docs-fill step, the SPARQL counts are recounted, Copenhagen is described by what it has - nine facility types from CSV, each on a map, and a chart by type - rather than a coloured overview and a neighbours view it no longer carries, and the UNESCO Thesaurus and packages sections say what the taxonomy package provides and that an import copies its ontology and stylesheet once, instead of that nothing is copied. The four pictures showed the UI before the redesign; readme/shoot.mjs re-shoots them against the three demo dataspaces (make readme-shots) with the docs shoot's want-before-capture rule: the Northwind parallax pivot as a GIF, the Copenhagen school map, and Denmark in the UNESCO Thesaurus, viewed and edited, with the concept tree revealing it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…l. The form used to hide each value's language until its row was hovered, so five preferred labels read as five bare strings with nothing to tell them apart; with the platform's form now showing the language as a chip at rest, the picture is re-shot with the tags on screen - ar, es, fr, ru and en beside the preferred labels, ar beside the alternative one - and Denmark still revealed in the concept tree. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ce stops naming a stylesheet that no longer ships. Every breaking change of 6.0.0 was written down in the platform's changelog and nowhere a reader of the documentation would find it, which left the class vocabulary, the renamed template modes, the namespace move and the conditional-write requirement discoverable only by hitting them. The new reference page carries them, grouped by who is affected: a stylesheet author, a deployment, a package, an API client, and an extension written in Java. The reference index links it. The CSS section named ldh-bridge.css, which was dissolved into ldh.css and ships nowhere, and described the cascade as one undifferentiated set with the two conditional feature stylesheets presented as unconditional. It now states the order the ac:Stylesheets mode emits, the ac-* and ldh-* component naming, the four axes that vary a component, and how to override the mode without dropping the vendored kits. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Every conflict resolves to develop's side, which already carries what master's feature branches added: the tutorial (since moved to the ldh CLI) and its links from about, get-started and build-apps; the inline creation docs, now in the resources reference that replaced views.ttl; and the SKOS prefLabel fix, superseded by the taxonomy package dropping the language filter altogether. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.