Kestrel Fastening Systems KESTREL FASTENING SYSTEMS

Headless probes

This composition has no headless surface. But the platform Delivery API is live, and it is the cheapest read-only probe an agent has. Say which is which.

What the baseline guarantees

NOT present: the `surface-headless` layer is not in this edition. There are no `Headless_*`
item types, no headless repository, no headless Delivery-API content tree. `headless-demo` is
a DIFFERENT edition (base + surface-headless + sample-data) with zero Swift design-package
dependency.
Present anyway, because it is platform: the `/dwapi/` Delivery API answers on this host for
the content and commerce this composition DOES have. It is the authoritative read surface for
a Swift solution's own structure (dw-swift-page-design/SKILL.md:127-134):
  /dwapi/api.json                         the live OpenAPI schema — fetch it, do not assume
  /dwapi/content/areas
  /dwapi/content/pages?AreaId=<id>
  /dwapi/content/rows/<pageId>/Desktop    -> row.Columns[].Paragraph (SINGULAR),
                                             row.Definition.Name; array order IS render order
  /dwapi/frontend/navigations/<areaId>?ExpandMode=all&StartLevel=1&StopLevel=3
  /dwapi/ecommerce/products/search?RepositoryName=&QueryName=&LanguageId=ENU&ShopId=SHOP1
  /dwapi/ecommerce/products/{id}
  /dwapi/users/authenticate               (JSON only — a form-encoded POST answers 415)
  /dwapi/ecommerce/favorites/lists
  /dwapi/feeds/VerifyConnection           the health ping
Two auth facts worth carrying: an ADMIN token on /dwapi/ecommerce/products answers 401 while
ANONYMOUS answers 200 — the two token types are not interchangeable, and the failure is a
non-401 shape rather than a fixed code, so detect it by shape. Product count is
`totalProductsCount`, not `products.length` (which is one page).
Use /dwapi as a READ probe on this site. Do not present it as a headless demo: nothing here
was built for a decoupled frontend.

Which skill covers it

dw-headless-delivery (dynamo: false, mcp: none) — references/endpoint-reference.md is the full
endpoint catalogue (510 lines) and the only file.
dw-demo-headless (dynamo: false) — references/headless-baseline.md,
references/headless-backend.md, references/headless-frontend.md — only if the customer wants
the headless edition, which is a different composition.

Which MCP tools brand it

No MCP tool writes the Delivery API — it is a read surface over what the other tools wrote.
The MCP equivalents for the same reads: get_areas, get_pages_by_area_id,
get_grid_rows_by_page_id, get_paragraphs_by_page_id, get_item_field_values.
get_frontend_health is the liveness probe.

Verify

The backend gate, in order (dw-demo-headless/references/headless-backend.md:181-195):
  GET /dwapi/api.json                                            -> 200
  GET /dwapi/ecommerce/products/{knownId}                        -> 200 with a full model
  admin token on /dwapi/ecommerce/products                       -> 401
  anonymous  on /dwapi/ecommerce/products                        -> 200
  GET /dwapi/ecommerce/products/search?...&LanguageId=ENU&ShopId=SHOP1
                                                                 -> 200, totalProductsCount>0
GET /dwapi/content/rows/<home page id>/Desktop returns the 8 Home grid rows in render order.
MCP: get_frontend_health returns healthy.
Negative assert that proves this is NOT a headless build: get_item_types returns no name
starting `Headless_`.