Fail-closed filtering
When OpenD is unsure whether a reader may see something, it hides it. A mistake in a condition can hide content, but never leak it.
For readers, each of these excludes the content it is on:
- a
productorfeaturevalue the reader's organization does not hold; - a value that is not declared in
opend.config.yaml, such as a typo likeproduct="embd", because no reader can hold it; - a
releasetoken that does not parse, such asrelease="next"; - any
releasecondition, when the reader's own version does not parse.
Because a typo silently hides content, validation reports undeclared values
(undeclared-value) and bad ranges (invalid-release) as errors, and the
hosted build refuses to publish them. You find out in the previewer or in CI, before readers do.
Lookups fall back, they don't reveal
The same rule holds wherever content is looked up rather than browsed:
- A link to a topic the reader cannot see renders as its authored text, without the target's title.
- A context-sensitive help key whose topic is hidden falls back to a parent key or the app's default, never to the hidden topic.
- An image is served only when a topic visible to that reader references it.
- A PDF publication with nothing visible returns the same 404 as one that does not exist.
A page the reader cannot see returns the same 404 as a page that does not exist, so guessing URLs reveals nothing.
Build attributes are different
audience, platform, otherprops,
props and deliveryTarget follow DITAVAL rules at build time instead:
a value with no rule is included. Declare them anyway; validation still reports undeclared ones.