Summary
The skill lifecycle hooks (skillRegister, skillLoad, skillUnload) have no OpenTelemetry span name and no OCSF event class. They are absent from both normative mapping files and from both tables on the Trace page. A deployment that emits them cannot claim ACS-Trace for them, because there is nothing to map them to.
Evidence
$ grep -c skill specification/v0.1.0/trace/otel-mapping.json
0
$ grep -c skill specification/v0.1.0/trace/ocsf-mapping.json
0
docs/spec/trace/events.md omits them from both the OTel span table and the OCSF class table. docs/spec/trace/extend_ocsf.md omits them as well. Every other native steps/* hook appears in all of these.
Why this is not just a documentation gap
The three hooks are normative in specification/v0.1.0/hooks/ and are listed in conformance.md as SHOULD-implement. The AgBOM already carries a skill component type. So a conformant deployment can be told to emit skill hooks and to claim ACS-Trace, and then find the two requirements do not compose.
This blocks implementers concretely. The three adapters in #22 emit no skill hooks today; if that is addressed, the emitted steps have no trace representation.
Same root cause as #56
The taxonomy table in Specification section 5 listed sixteen hooks while the Hooks page listed nineteen, omitting exactly this set. #56 fixes the table and adds a guard that binds it to the schemas. The Trace mappings were missed by the same original omission, but closing them requires decisions rather than a correction, so they are split out here.
Note that #56's guard covers the Instrument tables only. It does not check the Trace mappings, so it will not catch this or prevent a repeat. Worth extending once the mappings exist.
Decisions needed
OTel span names. The existing convention is acs.<area> with .end or a verb suffix (acs.subagent / acs.subagent.end, acs.compact / acs.compact.complete, acs.memory.store). Candidates: acs.skill.register, acs.skill.load, acs.skill.unload. Open question whether load and unload should pair as a span and its end, the way acs.subagent does, since a loaded skill has a lifetime within the session rather than being a point event.
OCSF class. Not obvious, and the choice carries meaning for SIEM consumers:
6002 Application Activity, treating a skill load as application behavior, consistent with agentTrigger and turnStart.
5001 Inventory Info, treating registration as a component entering the inventory, consistent with agbom/snapshot and with the fact that a registered skill becomes a skill AgBOM component.
- Split them:
skillRegister as 5001 because it is an inventory event that adds a component, and skillLoad / skillUnload as 6002 because they are runtime activity.
The split reads most faithful to what the hooks actually do, but it is the least consistent with how the other pairs were mapped, so it needs an owner's call.
Attributes. At minimum acs.skill.id and the digest. Whether the digest goes on the span as an attribute, and whether load_path is represented as an attribute, a span link, or parent/child spans, is worth deciding deliberately, since load_path is the inter-skill cascade signal and span links would preserve it better than a flattened string.
Scope
Touches specification/v0.1.0/trace/otel-mapping.json, specification/v0.1.0/trace/ocsf-mapping.json, docs/spec/trace/events.md, and docs/spec/trace/extend_ocsf.md. Whether this lands in v0.1.0 as a gap-fill or waits for v0.2 is part of the decision.
Summary
The skill lifecycle hooks (
skillRegister,skillLoad,skillUnload) have no OpenTelemetry span name and no OCSF event class. They are absent from both normative mapping files and from both tables on the Trace page. A deployment that emits them cannot claim ACS-Trace for them, because there is nothing to map them to.Evidence
docs/spec/trace/events.mdomits them from both the OTel span table and the OCSF class table.docs/spec/trace/extend_ocsf.mdomits them as well. Every other nativesteps/*hook appears in all of these.Why this is not just a documentation gap
The three hooks are normative in
specification/v0.1.0/hooks/and are listed inconformance.mdas SHOULD-implement. The AgBOM already carries askillcomponent type. So a conformant deployment can be told to emit skill hooks and to claim ACS-Trace, and then find the two requirements do not compose.This blocks implementers concretely. The three adapters in #22 emit no skill hooks today; if that is addressed, the emitted steps have no trace representation.
Same root cause as #56
The taxonomy table in Specification section 5 listed sixteen hooks while the Hooks page listed nineteen, omitting exactly this set. #56 fixes the table and adds a guard that binds it to the schemas. The Trace mappings were missed by the same original omission, but closing them requires decisions rather than a correction, so they are split out here.
Note that #56's guard covers the Instrument tables only. It does not check the Trace mappings, so it will not catch this or prevent a repeat. Worth extending once the mappings exist.
Decisions needed
OTel span names. The existing convention is
acs.<area>with.endor a verb suffix (acs.subagent/acs.subagent.end,acs.compact/acs.compact.complete,acs.memory.store). Candidates:acs.skill.register,acs.skill.load,acs.skill.unload. Open question whether load and unload should pair as a span and its end, the wayacs.subagentdoes, since a loaded skill has a lifetime within the session rather than being a point event.OCSF class. Not obvious, and the choice carries meaning for SIEM consumers:
6002Application Activity, treating a skill load as application behavior, consistent withagentTriggerandturnStart.5001Inventory Info, treating registration as a component entering the inventory, consistent withagbom/snapshotand with the fact that a registered skill becomes askillAgBOM component.skillRegisteras5001because it is an inventory event that adds a component, andskillLoad/skillUnloadas6002because they are runtime activity.The split reads most faithful to what the hooks actually do, but it is the least consistent with how the other pairs were mapped, so it needs an owner's call.
Attributes. At minimum
acs.skill.idand the digest. Whether the digest goes on the span as an attribute, and whetherload_pathis represented as an attribute, a span link, or parent/child spans, is worth deciding deliberately, sinceload_pathis the inter-skill cascade signal and span links would preserve it better than a flattened string.Scope
Touches
specification/v0.1.0/trace/otel-mapping.json,specification/v0.1.0/trace/ocsf-mapping.json,docs/spec/trace/events.md, anddocs/spec/trace/extend_ocsf.md. Whether this lands in v0.1.0 as a gap-fill or waits for v0.2 is part of the decision.