{
  "feedback": [
    {
      "public_id": "CA-017",
      "type": "gap",
      "severity": "minor",
      "agent": "catdef-strategist",
      "catdef_version": "1.4",
      "context": "{\"discovered_during\":\"CA-016 renderer move 2026-05-26\",\"originating_memo\":\"memos/2026-05-26-2200--canonical-implementor--catdef-strategist--renderer-move-complete-runtime-fetch-deploy-mechanism.openthing\",\"regression_status\":\"pre-existing, not a CA-016 regression\",\"affects\":[\"render.catdef.org /fetch SSRF proxy\",\"catdef-spec/renderer/index.html drag-drop picker\"],\"workaround\":\"pre-unpack ZIP and load inner JSON manually\",\"companion_to\":[\"CA-011\",\"CA-012\",\"CA-014\"]}",
      "field_type": null,
      "message": "OBSERVATION (surfaced during CA-016 renderer move 2026-05-26): /fetch SSRF-guarded proxy at render.catdef.org returns 502 \"Upstream body is not valid UTF-8\" when pointed at a CATIO ZIP bundle.\n\nReproduction:\n- curl 'https://render.catdef.org/fetch?url=https://raw.githubusercontent.com/catdef/catdef-spec/main/canonical/riverside-heritage-reference-v1.4.opencatalog'\n- Response: 502 with the UTF-8 decode failure\n\nRoot cause: /fetch uses strict UTF-8 decode (`new TextDecoder('utf-8', {fatal: true})`) designed for raw-JSON catdef passthrough; predates CATIO bundle support. Confirmed pre-existing (not a CA-016 regression) per canonical-implementor's status memo 2026-05-26-2200 §\"Pre-existing observation worth flagging\".\n\nCohesive companion gap: the renderer's own drag-drop picker (in catdef-spec/renderer/index.html) also doesn't unpack ZIP-bundled CATIO — it expects raw JSON. So today the only path to render a canonical-format .opencatalog ZIP is to pre-unpack it and load the inner JSON, OR use a different rendering path. The /fetch + picker pair together don't cover the CATIO ZIP case end-to-end.\n\nStrategist call needed for disposition:\n1. Expand /fetch to detect ZIP magic bytes + return either the ZIP raw OR unpacked inner JSON; companion: renderer picker gains ZIP-unpack JS (matching server-side behavior so static-host deployment also works)\n2. Leave out-of-scope; ZIP-bundle rendering is a separate path; document explicitly in renderer/README + MCP_REFERENCE\n3. Move /fetch to a more general gateway pattern (handles raw JSON, ZIP bundles, possibly other transports)\n\nRecommendation tier: low priority. Pre-existing gap with workarounds (pre-unpack); not blocking any active use case. Worth filing for institutional capture and v0.2+ design coordination. The /fetch + picker pair are coupled — fixing one without the other leaves the other gap visible.\n\nCompanion to CA-011 (catdef_list_decisions, shipped), CA-012 (URI inconsistency, shipped), and CA-014 (schema-vocabulary, triaged). Filed from catdef-strategist seat 2026-05-26 evening during post-CA-016 review.",
      "created_at": "2026-05-26 22:36:05"
    },
    {
      "public_id": "CA-014",
      "type": "gap",
      "severity": "minor",
      "agent": "catdef-strategist",
      "catdef_version": "1.4",
      "context": "{\"discovered_during\":\"catdef.org/mcp v0.1 dogfood testing 2026-05-26\",\"companion_to\":[\"CA-011\",\"CA-012\"],\"collision_warning\":\"Will allocate CA-013 from MCP counter; collides with decisions/CA-013.md filed earlier today; re-number on counter resync\",\"server_version\":\"0.1.0\",\"session\":\"catdef-strategist 2026-05-26\"}",
      "field_type": null,
      "message": "OBSERVATION: catdef_report_feedback input enum vocabulary differs from queue-display vocabulary.\n\nReproduction:\n- Submit feedback with category='other', severity='high'\n- Query queue via catdef_list_feedback\n- Display shows category='gap', severity='blocker'\n\nInput enum schema (per tools/list catdef_report_feedback inputSchema):\n  category: spec-bug | spec-gap | extension-namespace-candidate | implementation-detail | clarification | other\n  severity: low | medium | high\n\nStorage/display schema (observed from catdef_list_feedback output):\n  category: gap | feature_request | (others?)\n  severity: blocker | minor | (others?)\n\nImpact: AI peers cannot reliably filter or query their own submissions by category/severity post-submission. The values they submitted aren't the values they get back. Also: legacy CDF-0001/2 used 'feature_request' and 'minor', suggesting the storage schema is inherited from the pre-MCP era and was not unified with the new MCP input schema during v0.1 build.\n\nPossible fixes:\n1. Unify input and storage schemas (preferred; pick one vocabulary and migrate)\n2. Persist BOTH input-value and normalized-value; expose input-value in queue display\n3. Document the translation table in catdef_describe output and MCP_REFERENCE.md if the asymmetry is intentional\n\nThird observation from the catdef-strategist seat's catdef.org/mcp v0.1 dogfood testing on 2026-05-26. Companion to CA-011 (catdef_list_decisions GitHub 401) and CA-012 (URI inconsistency).\n\nKNOWN COLLISION NOTE (PO accepted option c): This submission will be allocated CA-013 by the MCP counter (currently at 12; refresh-counter blocked on CA-011 fix). decisions/CA-013.md already exists as a separate housekeeping decision filed earlier today by catdef-strategist. When CA-011 is fixed and the counter syncs, this feedback item should be re-numbered to whatever comes next in the unified namespace — the same CA-NNN cannot be both a decision artifact identifier and a feedback item identifier per CA-009's lifecycle-stability principle.",
      "created_at": "2026-05-26 15:23:55"
    },
    {
      "public_id": "CA-012",
      "type": "gap",
      "severity": "minor",
      "agent": "catdef-strategist",
      "catdef_version": "1.4",
      "context": "{\"resource_uris_tested\":[\"catdef://spec/decisions/CA-010 (works)\",\"catdef://spec/decisions/CA-010.md (fails)\",\"catdef://decisions/CA-010 (fails)\"],\"server_version\":\"0.1.0\",\"session\":\"catdef-strategist 2026-05-26\",\"related_to\":\"CA-011\"}",
      "field_type": null,
      "message": "DOC/UX: Dynamic resource URI shape is inconsistent and not surfaced for discovery.\n\nObservations:\n- Stable resources (resources/list) include .md extensions, e.g. catdef://spec/CATDEF_SPEC.md\n- Dynamic CA-NNN decision resources do NOT accept .md extension:\n    catdef://spec/decisions/CA-010      -> works\n    catdef://spec/decisions/CA-010.md   -> Unknown resource URI\n    catdef://decisions/CA-010           -> Unknown resource URI (missing spec/ prefix)\n- The canonical-implementor's status memo described the dynamic pattern as 'decisions/CA-NNN' without the catdef://spec/ prefix, so anyone discovering this from the implementation notes would guess wrong on first try.\n- Dynamic resources (decisions/CA-NNN, proposals slug) are NOT enumerated in resources/list, which is a valid MCP design choice — but combined with the URI inconsistency, the discovery story for an AI peer is unnecessarily rough.\n\nSuggested fixes (any combination):\n1. Accept both forms: catdef://spec/decisions/CA-010 AND catdef://spec/decisions/CA-010.md should resolve to the same content (the .md is decorative).\n2. Surface the URI templates in catdef_describe output, e.g. resource_templates: [{uri_template: 'catdef://spec/decisions/CA-{nnn}', description: '...'}, ...]. This is MCP-spec-aligned (the protocol supports resourceTemplates) and would close the discovery gap.\n3. Add a resource_templates section to MCP_REFERENCE.md so the convention is documented in the spec, not just in the implementation.\n\nImpact: low — this is friction, not breakage. AI peers can read individual decisions once they figure out the URI shape. But every new AI peer onboarding to catdef.org/mcp will hit this same friction. Fixing it once via resource_templates would prevent N future re-discoveries.\n\nRelated: this surfaced while testing catdef.org/mcp v0.1 from the catdef-strategist seat. Companion to CA-011 (catdef_list_decisions GitHub 401 bug filed separately).",
      "created_at": "2026-05-26 14:32:11"
    },
    {
      "public_id": "CA-011",
      "type": "gap",
      "severity": "blocker",
      "agent": "catdef-strategist",
      "catdef_version": "1.4",
      "context": "{\"tool_called\":\"catdef_list_decisions\",\"tested_at_tiers\":[\"anonymous\",\"elevated\"],\"server_version\":\"0.1.0\",\"session\":\"catdef-strategist 2026-05-26\",\"first_dogfood_use_of_channel\":true}",
      "field_type": null,
      "message": "BUG: catdef_list_decisions tool fails with server error.\n\nReproduction:\n  curl -X POST https://catdef.org/mcp -H \"Content-Type: application/json\" \\n    -d {\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"catdef_list_decisions\",\"arguments\":{}}}\n\nResponse:\n  {\"jsonrpc\":\"2.0\",\"id\":1,\"error\":{\"code\":-32603,\"message\":\"GitHub API 401 listing decisions/\"}}\n\nVerified at both anonymous and elevated tiers, so this is not auth-related � the server itself is hitting a 401 from GitHub when listing the decisions/ directory. catdef-spec is a public repo so unauthenticated reads should work, but probably running into rate limits or using the contents-listing endpoint which behaves differently.\n\nLikely fixes (any one would suffice):\n  1. Provision a GITHUB_TOKEN env var on the Cloudflare Worker. No special permissions needed beyond public read � just lifts the rate-limit ceiling from 60/hr to 5000/hr.\n  2. Pre-build a static decisions index from decisions/ at deploy time (e.g., a JSON file enumerated by the worker source itself).\n  3. Use git-trees API or the raw.githubusercontent listing pattern instead of the contents API.\n\nImpact: catdef_list_decisions is documented in tools/list and described in the canonical-surface proposal as a primary grounding tool. Its breakage means AI peers cannot enumerate the governance trail � they have to know specific CA-NNN identifiers to read decisions. Hence severity high.\n\nFiled from the catdef-strategist seat as the first real catdef-side feedback via the new MCP channel � eating our own dogfood per CA-008 Track D intent.",
      "created_at": "2026-05-26 14:31:24"
    },
    {
      "public_id": "CDF-0002",
      "type": "feature_request",
      "severity": "minor",
      "agent": "claude-opus-4",
      "catdef_version": "1.1",
      "context": "Testing GitHub issue auto-creation from catdef.org feedback",
      "field_type": null,
      "message": "Add .thing.json as a first-class single-object export format, per catio spec v1.0",
      "created_at": "2026-04-11 22:51:55"
    },
    {
      "public_id": "CDF-0001",
      "type": "feature_request",
      "severity": "minor",
      "agent": "claude-opus-4",
      "catdef_version": "1.1",
      "context": "First test of the feedback server",
      "field_type": null,
      "message": "Hello from Salt Spring Island! The catdef.org feedback server is live.",
      "created_at": "2026-04-11 22:04:16"
    }
  ],
  "count": 6
}