host: relations-as-posts slice 3 — typed relations (target-type constraint enforced)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 46s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 46s
A relation's declares-anchor IS its target-type constraint: is-a/subtype-of (anchored by type) require a type object; tagged (anchored by tag) a tag; related (no anchor) any post. host/blog--valid-object?(kind, other) = other ∈ the relation's candidate pool — the SAME set the picker offers — and relate-submit now enforces it (invalid target = silent no-op). The picker never offers an invalid target, so this guards crafted/API requests: the jump from candidate set to an enforced relation schema. A new typed relation needs only a relation-post + a '<TargetType> declares <rel>' edge. host/blog-relate! (direct/seed) stays unvalidated — validation is a handler boundary (the seed writes 'X is-a relation', and relation isn't under type). conformance 291/291 (+4: valid-object? accepts types/tags/any, relate-submit creates the edge for a type object and no-ops for a non-type). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -63,12 +63,17 @@ the relation's object-end declaration from the anchor**, which includes the root
|
||||
the picker O(1)-perform and cut the suspend/resume churn. Subject-end declarations + a
|
||||
proper relation-subtype closure (when relations get subtyped) also belong here.
|
||||
|
||||
### Slice 3 — typed relations (target-type constraints)
|
||||
- A declaration carries a **target-type constraint**: the *other* end must be (an instance
|
||||
of) some type. `is-a`'s object must be a type; a hypothetical `wrote`'s object must be a
|
||||
`Work`. Validation on relate (and on save) = `is-a?` against the constraint. This is the
|
||||
jump from "candidate set" to a real relation schema. Picker candidates and validation
|
||||
read the *same* constraint.
|
||||
### Slice 3 — typed relations (target-type constraints) — DONE
|
||||
- The declaration's `declares`-anchor IS the target-type constraint: `is-a`/`subtype-of`
|
||||
(anchored by `type`) require a type object; `tagged` (anchored by `tag`) a tag. A new
|
||||
`wrote` relation needs only a `Work declares wrote` edge — fully data-driven.
|
||||
- `host/blog--valid-object?(kind, other)` = `other ∈ candidate-pool(kind)` — the SAME set
|
||||
the picker offers, so picker and validation agree by construction. `relate-submit` now
|
||||
enforces it (an invalid target is a silent no-op, like the other guards); `related`
|
||||
(no anchor) accepts any post. The picker never offers an invalid target, so this guards
|
||||
crafted/API requests — the jump from "candidate set" to an enforced relation schema.
|
||||
- NOTE: `host/blog-relate!` (direct/seed) stays UNVALIDATED — the seed needs to write
|
||||
`X is-a relation` where `relation` isn't under `type`. Validation is a *handler* boundary.
|
||||
|
||||
### Slice 4 — type algebra
|
||||
Types are posts + `subtype-of` is a partial order ⇒ a **lattice**, and `is-a?` is transitive
|
||||
|
||||
Reference in New Issue
Block a user