Grammar, statute schema key pattern, parser (is_resource_type, also used by statute lint), reference parser, spec 6.1 and a new CHANGELOG. Fixtures p1-042..045; prop-case-001 Ticket=PR42 is now invalid. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Assistant: claude-code Assistant-Model: opus Assistant-Process: 252470@bnt-lap001 Assistant-Session: ad628c8f-4be2-4979-94c9-76c7ed6f8241
263 lines
6 KiB
JSON
263 lines
6 KiB
JSON
[
|
|
{
|
|
"id": "prop-len-063",
|
|
"local_part": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"profile": "p1",
|
|
"valid": true,
|
|
"parsed": {
|
|
"target": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"target_kind": "opaque",
|
|
"facet": null,
|
|
"interaction": null
|
|
},
|
|
"note": "63 octets"
|
|
},
|
|
{
|
|
"id": "prop-len-064",
|
|
"local_part": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"profile": "p1",
|
|
"valid": true,
|
|
"parsed": {
|
|
"target": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"target_kind": "opaque",
|
|
"facet": null,
|
|
"interaction": null
|
|
},
|
|
"note": "64 octets: exactly the SMTP limit"
|
|
},
|
|
{
|
|
"id": "prop-len-065",
|
|
"local_part": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
|
|
"profile": "p1",
|
|
"valid": false,
|
|
"error": "too-long",
|
|
"note": "65 octets exceeds the SMTP limit"
|
|
},
|
|
{
|
|
"id": "prop-len-065-p2",
|
|
"local_part": "ticket=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx!callback",
|
|
"profile": "p2",
|
|
"valid": false,
|
|
"error": "too-long",
|
|
"note": "limit applies to the whole local-part incl. operators"
|
|
},
|
|
{
|
|
"id": "prop-eq-001",
|
|
"local_part": "ticket==PR42",
|
|
"profile": "p1",
|
|
"valid": true,
|
|
"parsed": {
|
|
"target": "ticket==PR42",
|
|
"target_kind": "resource",
|
|
"facet": null,
|
|
"interaction": null,
|
|
"resource_type": "ticket",
|
|
"resource_id": "=PR42"
|
|
},
|
|
"note": "only the first '=' is structural"
|
|
},
|
|
{
|
|
"id": "prop-eq-002",
|
|
"local_part": "ticket=PR42=",
|
|
"profile": "p1",
|
|
"valid": true,
|
|
"parsed": {
|
|
"target": "ticket=PR42=",
|
|
"target_kind": "resource",
|
|
"facet": null,
|
|
"interaction": null,
|
|
"resource_type": "ticket",
|
|
"resource_id": "PR42="
|
|
},
|
|
"note": "trailing '=' is resource-id data"
|
|
},
|
|
{
|
|
"id": "prop-eq-003",
|
|
"local_part": "bernd.worsch+a=b",
|
|
"profile": "p1",
|
|
"valid": true,
|
|
"parsed": {
|
|
"target": "bernd.worsch",
|
|
"target_kind": "opaque",
|
|
"facet": "a=b",
|
|
"interaction": null
|
|
},
|
|
"note": "'=' is data inside a facet"
|
|
},
|
|
{
|
|
"id": "prop-res-001",
|
|
"local_part": "$",
|
|
"profile": "p1",
|
|
"valid": false,
|
|
"error": "reserved-operator"
|
|
},
|
|
{
|
|
"id": "prop-res-002",
|
|
"local_part": "support^",
|
|
"profile": "p1",
|
|
"valid": false,
|
|
"error": "reserved-operator"
|
|
},
|
|
{
|
|
"id": "prop-res-003",
|
|
"local_part": "ticket!callback$",
|
|
"profile": "p2",
|
|
"valid": false,
|
|
"error": "reserved-operator"
|
|
},
|
|
{
|
|
"id": "prop-res-004",
|
|
"local_part": "ticket!call^back",
|
|
"profile": "p2",
|
|
"valid": false,
|
|
"error": "reserved-operator"
|
|
},
|
|
{
|
|
"id": "prop-p2-001",
|
|
"local_part": "ticket!callback",
|
|
"profile": "p2",
|
|
"valid": true,
|
|
"parsed": {
|
|
"target": "ticket",
|
|
"target_kind": "opaque",
|
|
"facet": null,
|
|
"interaction": "callback"
|
|
},
|
|
"required_profile": "P2",
|
|
"generator_allowed": true,
|
|
"note": "maximal parser accepts; namespace support for P2 is a policy question"
|
|
},
|
|
{
|
|
"id": "prop-p2-002",
|
|
"local_part": "support+urgent",
|
|
"profile": "p1",
|
|
"valid": true,
|
|
"parsed": {
|
|
"target": "support",
|
|
"target_kind": "opaque",
|
|
"facet": "urgent",
|
|
"interaction": null
|
|
},
|
|
"required_profile": "P1",
|
|
"base": "support",
|
|
"note": "registry lookup operates on the base target 'support', never 'support+urgent'"
|
|
},
|
|
{
|
|
"id": "prop-pct-001",
|
|
"local_part": "a%40b",
|
|
"profile": "p1",
|
|
"valid": true,
|
|
"parsed": {
|
|
"target": "a%40b",
|
|
"target_kind": "opaque",
|
|
"facet": null,
|
|
"interaction": null
|
|
},
|
|
"note": "percent sequences are data, never decoded"
|
|
},
|
|
{
|
|
"id": "prop-op-001",
|
|
"local_part": "+comments",
|
|
"profile": "p1",
|
|
"valid": false,
|
|
"error": "empty-target"
|
|
},
|
|
{
|
|
"id": "prop-op-002",
|
|
"local_part": "!callback",
|
|
"profile": "p2",
|
|
"valid": false,
|
|
"error": "empty-target"
|
|
},
|
|
{
|
|
"id": "prop-op-003",
|
|
"local_part": "ticket=PR42+",
|
|
"profile": "p1",
|
|
"valid": false,
|
|
"error": "empty-facet"
|
|
},
|
|
{
|
|
"id": "prop-op-004",
|
|
"local_part": "ticket=+x",
|
|
"profile": "p1",
|
|
"valid": false,
|
|
"error": "empty-resource-id"
|
|
},
|
|
{
|
|
"id": "prop-op-005",
|
|
"local_part": "tic.ket=PR42",
|
|
"profile": "p1",
|
|
"valid": false,
|
|
"error": "invalid-resource-type",
|
|
"note": "resource-type has no '.'"
|
|
},
|
|
{
|
|
"id": "prop-op-006",
|
|
"local_part": "ticket=PR..42",
|
|
"profile": "p1",
|
|
"valid": false,
|
|
"error": "invalid-resource-id"
|
|
},
|
|
{
|
|
"id": "prop-op-007",
|
|
"local_part": "ticket+.x",
|
|
"profile": "p1",
|
|
"valid": false,
|
|
"error": "invalid-facet"
|
|
},
|
|
{
|
|
"id": "prop-op-008",
|
|
"local_part": "ticket!a..b",
|
|
"profile": "p2",
|
|
"valid": false,
|
|
"error": "invalid-interaction"
|
|
},
|
|
{
|
|
"id": "prop-op-009",
|
|
"local_part": "a b",
|
|
"profile": "p1",
|
|
"valid": false,
|
|
"error": "invalid-target"
|
|
},
|
|
{
|
|
"id": "prop-op-010",
|
|
"local_part": "ticket+a!",
|
|
"profile": "p2",
|
|
"valid": false,
|
|
"error": "empty-interaction"
|
|
},
|
|
{
|
|
"id": "prop-kind-001",
|
|
"local_part": "research-companion",
|
|
"profile": "p1",
|
|
"valid": true,
|
|
"parsed": {
|
|
"target": "research-companion",
|
|
"target_kind": "opaque",
|
|
"facet": null,
|
|
"interaction": null
|
|
},
|
|
"note": "no actor inference from '-'"
|
|
},
|
|
{
|
|
"id": "prop-kind-002",
|
|
"local_part": "invoice_ingest",
|
|
"profile": "p1",
|
|
"valid": true,
|
|
"parsed": {
|
|
"target": "invoice_ingest",
|
|
"target_kind": "opaque",
|
|
"facet": null,
|
|
"interaction": null
|
|
},
|
|
"note": "no function inference from '_'"
|
|
},
|
|
{
|
|
"id": "prop-case-001",
|
|
"local_part": "Ticket=PR42",
|
|
"profile": "p1",
|
|
"valid": false,
|
|
"error": "invalid-resource-type",
|
|
"note": "v0.1.1 (SCP-2): resource types are lower-case; was valid in v0.1"
|
|
}
|
|
]
|