[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-symfony-symfony-service-inspection":3,"mdc-w9y7xs-key":34,"related-org-symfony-symfony-service-inspection":507,"related-repo-symfony-symfony-service-inspection":585},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":29,"sourceUrl":32,"mdContent":33},"symfony-service-inspection","debug Symfony dependency injection and wiring","Diagnose a Symfony dependency-injection or wiring problem, service not found, wrong implementation injected, an autoconfigured tag not applied, or a factory\u002Fdecorator not doing what you expect. Use for container\u002Fconfig bugs, not runtime request errors (profiler), log trends (log investigation), or a missing PHP extension breaking the tool itself (php environment check).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"symfony","Symfony","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fsymfony.png",[12,16,19],{"name":13,"slug":14,"type":15},"PHP","php","tag",{"name":17,"slug":18,"type":15},"Architecture","architecture",{"name":20,"slug":21,"type":15},"Debugging","debugging",1159,"https:\u002F\u002Fgithub.com\u002Fsymfony\u002Fai","2026-08-31T09:18:43.894994",null,246,[28,14,8],"ai",{"repoUrl":23,"stars":22,"forks":26,"topics":30,"description":31},[28,14,8],"Symfony AI is a set of components that integrate AI capabilities into PHP applications","https:\u002F\u002Fgithub.com\u002Fsymfony\u002Fai\u002Ftree\u002FHEAD\u002Fsrc\u002Fmate\u002Fsrc\u002FBridge\u002FSymfony\u002Fskills\u002Fsymfony-service-inspection","---\nname: symfony-service-inspection\ndescription: Diagnose a Symfony dependency-injection or wiring problem, service not found, wrong implementation injected, an autoconfigured tag not applied, or a factory\u002Fdecorator not doing what you expect. Use for container\u002Fconfig bugs, not runtime request errors (profiler), log trends (log investigation), or a missing PHP extension breaking the tool itself (php environment check).\n---\n\n# Service inspection\n\nReads the compiled DI container through Mate's CLI, from the dumped `*DebugContainer.xml`. Two tools:\n\n- `symfony-services` (opt `query`, `tag`, `limit`): `query` is a case-insensitive partial match on service id OR class; `tag` is an exact tag name. Returns `{services: {id => class}, count, truncated}`. `count` is the number of matches before the cut, `truncated` says whether `limit` (default 100) hid some. Narrow the filter rather than raising `limit`.\n- `symfony-service-detail --id=\u003Cexact id>`: full detail for one service, `{id, class, tags, calls, factory?}`. The id must be exact.\n\nBoth commands accept `--format`: `json` to parse the result, `toon` (when `helgesverre\u002Ftoon` is installed) for the smallest context footprint. The service map can be large, so filter it rather than dumping it wide.\n\n## Workflow\n\n1. Locate candidates with `symfony-services`, filtered. Never dump the whole container.\n   - By class or interface: `vendor\u002Fbin\u002Fmate tools:call symfony-services --query=MailerInterface`\n   - By id fragment: `--query=app.handler`\n   - By tag, to see who participates in a hook: `vendor\u002Fbin\u002Fmate tools:call symfony-services --tag=kernel.event_listener`\n2. Take the exact id from that map and read it: `vendor\u002Fbin\u002Fmate tools:call symfony-service-detail --id=App\\\\Mailer\\\\Mailer`.\n3. Interpret against the symptom below.\n\n## Reading\n\n- **Wrong implementation injected:** query the interface. Every id mapping to a class is a candidate. The one wired in is usually the alias whose id equals the interface FQCN. Aliases are resolved for you: asking for the alias id returns the target's class, tags, and calls, so `detail` on the interface id shows the concrete class that actually gets injected.\n- **Tag not applied (listener\u002Fsubscriber\u002Fextension silent):** `detail` the service and check `tags`. If the expected tag is absent, autoconfiguration did not fire, usually because the class does not implement the expected interface\u002Fattribute, or `autoconfigure` is off. Each tag entry carries its attributes (`event`, `priority`, `method`, ...); a listener bound to the wrong `event` or `priority` is a common cause.\n- **Constructor\u002Ffactory surprise:** `factory` (present only when set) is `Class::method`, telling you the object is built by a factory, not `new`. `calls` lists setter-injection method names invoked after construction. A dependency that is null at runtime is often a missing setter call here.\n\n## Failure paths\n\n- `symfony-service-detail` errors \"Service ... not found\": the id is not exact. Ids are case-sensitive and a leading dot is stripped (`.inner` is stored as `inner`). Re-run `symfony-services` with a fragment to copy the real id. Note a service can exist yet be private; it still appears here.\n- Either tool errors \"No compiled container found\": the dump only exists after the container is compiled. Warm it (`bin\u002Fconsole cache:warmup`, or just boot the app once) in the environment you are inspecting, then retry. An empty `services` map with `count: 0` is a different answer and means the filter matched nothing. If a warm cache still yields nothing, the parse itself may be failing because the runtime lacks `simplexml`; confirm the environment with php environment check.\n- Reads the first of dev\u002Ftest\u002Fprod it finds. If you are chasing an env-specific binding, make sure that environment's container has been compiled, otherwise you are reading dev.\n",{"data":35,"body":36},{"name":4,"description":6},{"type":37,"children":38},"root",[39,48,63,172,209,216,285,291,422,428],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"service-inspection",[45],{"type":46,"value":47},"text","Service inspection",{"type":40,"tag":49,"props":50,"children":51},"p",{},[52,54,61],{"type":46,"value":53},"Reads the compiled DI container through Mate's CLI, from the dumped ",{"type":40,"tag":55,"props":56,"children":58},"code",{"className":57},[],[59],{"type":46,"value":60},"*DebugContainer.xml",{"type":46,"value":62},". Two tools:",{"type":40,"tag":64,"props":65,"children":66},"ul",{},[67,153],{"type":40,"tag":68,"props":69,"children":70},"li",{},[71,77,79,85,87,92,93,99,101,106,108,113,115,121,123,129,131,137,139,144,146,151],{"type":40,"tag":55,"props":72,"children":74},{"className":73},[],[75],{"type":46,"value":76},"symfony-services",{"type":46,"value":78}," (opt ",{"type":40,"tag":55,"props":80,"children":82},{"className":81},[],[83],{"type":46,"value":84},"query",{"type":46,"value":86},", ",{"type":40,"tag":55,"props":88,"children":90},{"className":89},[],[91],{"type":46,"value":15},{"type":46,"value":86},{"type":40,"tag":55,"props":94,"children":96},{"className":95},[],[97],{"type":46,"value":98},"limit",{"type":46,"value":100},"): ",{"type":40,"tag":55,"props":102,"children":104},{"className":103},[],[105],{"type":46,"value":84},{"type":46,"value":107}," is a case-insensitive partial match on service id OR class; ",{"type":40,"tag":55,"props":109,"children":111},{"className":110},[],[112],{"type":46,"value":15},{"type":46,"value":114}," is an exact tag name. Returns ",{"type":40,"tag":55,"props":116,"children":118},{"className":117},[],[119],{"type":46,"value":120},"{services: {id => class}, count, truncated}",{"type":46,"value":122},". ",{"type":40,"tag":55,"props":124,"children":126},{"className":125},[],[127],{"type":46,"value":128},"count",{"type":46,"value":130}," is the number of matches before the cut, ",{"type":40,"tag":55,"props":132,"children":134},{"className":133},[],[135],{"type":46,"value":136},"truncated",{"type":46,"value":138}," says whether ",{"type":40,"tag":55,"props":140,"children":142},{"className":141},[],[143],{"type":46,"value":98},{"type":46,"value":145}," (default 100) hid some. Narrow the filter rather than raising ",{"type":40,"tag":55,"props":147,"children":149},{"className":148},[],[150],{"type":46,"value":98},{"type":46,"value":152},".",{"type":40,"tag":68,"props":154,"children":155},{},[156,162,164,170],{"type":40,"tag":55,"props":157,"children":159},{"className":158},[],[160],{"type":46,"value":161},"symfony-service-detail --id=\u003Cexact id>",{"type":46,"value":163},": full detail for one service, ",{"type":40,"tag":55,"props":165,"children":167},{"className":166},[],[168],{"type":46,"value":169},"{id, class, tags, calls, factory?}",{"type":46,"value":171},". The id must be exact.",{"type":40,"tag":49,"props":173,"children":174},{},[175,177,183,185,191,193,199,201,207],{"type":46,"value":176},"Both commands accept ",{"type":40,"tag":55,"props":178,"children":180},{"className":179},[],[181],{"type":46,"value":182},"--format",{"type":46,"value":184},": ",{"type":40,"tag":55,"props":186,"children":188},{"className":187},[],[189],{"type":46,"value":190},"json",{"type":46,"value":192}," to parse the result, ",{"type":40,"tag":55,"props":194,"children":196},{"className":195},[],[197],{"type":46,"value":198},"toon",{"type":46,"value":200}," (when ",{"type":40,"tag":55,"props":202,"children":204},{"className":203},[],[205],{"type":46,"value":206},"helgesverre\u002Ftoon",{"type":46,"value":208}," is installed) for the smallest context footprint. The service map can be large, so filter it rather than dumping it wide.",{"type":40,"tag":210,"props":211,"children":213},"h2",{"id":212},"workflow",[214],{"type":46,"value":215},"Workflow",{"type":40,"tag":217,"props":218,"children":219},"ol",{},[220,268,280],{"type":40,"tag":68,"props":221,"children":222},{},[223,225,230,232],{"type":46,"value":224},"Locate candidates with ",{"type":40,"tag":55,"props":226,"children":228},{"className":227},[],[229],{"type":46,"value":76},{"type":46,"value":231},", filtered. Never dump the whole container.\n",{"type":40,"tag":64,"props":233,"children":234},{},[235,246,257],{"type":40,"tag":68,"props":236,"children":237},{},[238,240],{"type":46,"value":239},"By class or interface: ",{"type":40,"tag":55,"props":241,"children":243},{"className":242},[],[244],{"type":46,"value":245},"vendor\u002Fbin\u002Fmate tools:call symfony-services --query=MailerInterface",{"type":40,"tag":68,"props":247,"children":248},{},[249,251],{"type":46,"value":250},"By id fragment: ",{"type":40,"tag":55,"props":252,"children":254},{"className":253},[],[255],{"type":46,"value":256},"--query=app.handler",{"type":40,"tag":68,"props":258,"children":259},{},[260,262],{"type":46,"value":261},"By tag, to see who participates in a hook: ",{"type":40,"tag":55,"props":263,"children":265},{"className":264},[],[266],{"type":46,"value":267},"vendor\u002Fbin\u002Fmate tools:call symfony-services --tag=kernel.event_listener",{"type":40,"tag":68,"props":269,"children":270},{},[271,273,279],{"type":46,"value":272},"Take the exact id from that map and read it: ",{"type":40,"tag":55,"props":274,"children":276},{"className":275},[],[277],{"type":46,"value":278},"vendor\u002Fbin\u002Fmate tools:call symfony-service-detail --id=App\\\\Mailer\\\\Mailer",{"type":46,"value":152},{"type":40,"tag":68,"props":281,"children":282},{},[283],{"type":46,"value":284},"Interpret against the symptom below.",{"type":40,"tag":210,"props":286,"children":288},{"id":287},"reading",[289],{"type":46,"value":290},"Reading",{"type":40,"tag":64,"props":292,"children":293},{},[294,313,382],{"type":40,"tag":68,"props":295,"children":296},{},[297,303,305,311],{"type":40,"tag":298,"props":299,"children":300},"strong",{},[301],{"type":46,"value":302},"Wrong implementation injected:",{"type":46,"value":304}," query the interface. Every id mapping to a class is a candidate. The one wired in is usually the alias whose id equals the interface FQCN. Aliases are resolved for you: asking for the alias id returns the target's class, tags, and calls, so ",{"type":40,"tag":55,"props":306,"children":308},{"className":307},[],[309],{"type":46,"value":310},"detail",{"type":46,"value":312}," on the interface id shows the concrete class that actually gets injected.",{"type":40,"tag":68,"props":314,"children":315},{},[316,321,323,328,330,336,338,344,346,352,353,359,360,366,368,373,375,380],{"type":40,"tag":298,"props":317,"children":318},{},[319],{"type":46,"value":320},"Tag not applied (listener\u002Fsubscriber\u002Fextension silent):",{"type":46,"value":322}," ",{"type":40,"tag":55,"props":324,"children":326},{"className":325},[],[327],{"type":46,"value":310},{"type":46,"value":329}," the service and check ",{"type":40,"tag":55,"props":331,"children":333},{"className":332},[],[334],{"type":46,"value":335},"tags",{"type":46,"value":337},". If the expected tag is absent, autoconfiguration did not fire, usually because the class does not implement the expected interface\u002Fattribute, or ",{"type":40,"tag":55,"props":339,"children":341},{"className":340},[],[342],{"type":46,"value":343},"autoconfigure",{"type":46,"value":345}," is off. Each tag entry carries its attributes (",{"type":40,"tag":55,"props":347,"children":349},{"className":348},[],[350],{"type":46,"value":351},"event",{"type":46,"value":86},{"type":40,"tag":55,"props":354,"children":356},{"className":355},[],[357],{"type":46,"value":358},"priority",{"type":46,"value":86},{"type":40,"tag":55,"props":361,"children":363},{"className":362},[],[364],{"type":46,"value":365},"method",{"type":46,"value":367},", ...); a listener bound to the wrong ",{"type":40,"tag":55,"props":369,"children":371},{"className":370},[],[372],{"type":46,"value":351},{"type":46,"value":374}," or ",{"type":40,"tag":55,"props":376,"children":378},{"className":377},[],[379],{"type":46,"value":358},{"type":46,"value":381}," is a common cause.",{"type":40,"tag":68,"props":383,"children":384},{},[385,390,391,397,399,405,407,413,414,420],{"type":40,"tag":298,"props":386,"children":387},{},[388],{"type":46,"value":389},"Constructor\u002Ffactory surprise:",{"type":46,"value":322},{"type":40,"tag":55,"props":392,"children":394},{"className":393},[],[395],{"type":46,"value":396},"factory",{"type":46,"value":398}," (present only when set) is ",{"type":40,"tag":55,"props":400,"children":402},{"className":401},[],[403],{"type":46,"value":404},"Class::method",{"type":46,"value":406},", telling you the object is built by a factory, not ",{"type":40,"tag":55,"props":408,"children":410},{"className":409},[],[411],{"type":46,"value":412},"new",{"type":46,"value":122},{"type":40,"tag":55,"props":415,"children":417},{"className":416},[],[418],{"type":46,"value":419},"calls",{"type":46,"value":421}," lists setter-injection method names invoked after construction. A dependency that is null at runtime is often a missing setter call here.",{"type":40,"tag":210,"props":423,"children":425},{"id":424},"failure-paths",[426],{"type":46,"value":427},"Failure paths",{"type":40,"tag":64,"props":429,"children":430},{},[431,465,502],{"type":40,"tag":68,"props":432,"children":433},{},[434,440,442,448,450,456,458,463],{"type":40,"tag":55,"props":435,"children":437},{"className":436},[],[438],{"type":46,"value":439},"symfony-service-detail",{"type":46,"value":441}," errors \"Service ... not found\": the id is not exact. Ids are case-sensitive and a leading dot is stripped (",{"type":40,"tag":55,"props":443,"children":445},{"className":444},[],[446],{"type":46,"value":447},".inner",{"type":46,"value":449}," is stored as ",{"type":40,"tag":55,"props":451,"children":453},{"className":452},[],[454],{"type":46,"value":455},"inner",{"type":46,"value":457},"). Re-run ",{"type":40,"tag":55,"props":459,"children":461},{"className":460},[],[462],{"type":46,"value":76},{"type":46,"value":464}," with a fragment to copy the real id. Note a service can exist yet be private; it still appears here.",{"type":40,"tag":68,"props":466,"children":467},{},[468,470,476,478,484,486,492,494,500],{"type":46,"value":469},"Either tool errors \"No compiled container found\": the dump only exists after the container is compiled. Warm it (",{"type":40,"tag":55,"props":471,"children":473},{"className":472},[],[474],{"type":46,"value":475},"bin\u002Fconsole cache:warmup",{"type":46,"value":477},", or just boot the app once) in the environment you are inspecting, then retry. An empty ",{"type":40,"tag":55,"props":479,"children":481},{"className":480},[],[482],{"type":46,"value":483},"services",{"type":46,"value":485}," map with ",{"type":40,"tag":55,"props":487,"children":489},{"className":488},[],[490],{"type":46,"value":491},"count: 0",{"type":46,"value":493}," is a different answer and means the filter matched nothing. If a warm cache still yields nothing, the parse itself may be failing because the runtime lacks ",{"type":40,"tag":55,"props":495,"children":497},{"className":496},[],[498],{"type":46,"value":499},"simplexml",{"type":46,"value":501},"; confirm the environment with php environment check.",{"type":40,"tag":68,"props":503,"children":504},{},[505],{"type":46,"value":506},"Reads the first of dev\u002Ftest\u002Fprod it finds. If you are chasing an env-specific binding, make sure that environment's container has been compiled, otherwise you are reading dev.",{"items":508,"total":584},[509,524,537,549,555,569],{"slug":510,"name":510,"fn":511,"description":512,"org":513,"tags":514,"stars":22,"repoUrl":23,"updatedAt":523},"symfony-log-investigation","investigate Symfony application logs","Investigate an error or behavior across Monolog log files when there is no single profile to read, or when tracking something over time or across requests. Use for \"when did this start\", \"how often\", or following one request\u002Fuser through the logs. For a single known request that still has a profile, prefer profiler debugging.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[515,516,519,522],{"name":20,"slug":21,"type":15},{"name":517,"slug":518,"type":15},"Logs","logs",{"name":520,"slug":521,"type":15},"Observability","observability",{"name":13,"slug":14,"type":15},"2026-08-31T09:18:44.585214",{"slug":525,"name":525,"fn":526,"description":527,"org":528,"tags":529,"stars":22,"repoUrl":23,"updatedAt":536},"symfony-profiler-debugging","diagnose Symfony request errors and performance","Diagnose a Symfony request that failed, errored (5xx), or was slow, using the profiler. Use when a specific request misbehaved and the app has the profiler enabled (usually dev). Not for cross-request trends over time (use log investigation) or DI wiring bugs (use service inspection).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[530,531,532,535],{"name":20,"slug":21,"type":15},{"name":520,"slug":521,"type":15},{"name":533,"slug":534,"type":15},"Performance","performance",{"name":13,"slug":14,"type":15},"2026-08-31T09:19:32.021005",{"slug":538,"name":538,"fn":539,"description":540,"org":541,"tags":542,"stars":22,"repoUrl":23,"updatedAt":548},"symfony-request-triage","triage Symfony request failures","First step ONLY when a Symfony request misbehaved and you do not yet know whether the answer is in the profiler, the logs, or the container. One call, then it hands off to the right skill. Skip it entirely and go straight to that skill if you already know the profile token, the log channel or query, or that it is a DI wiring bug.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[543,544,547],{"name":20,"slug":21,"type":15},{"name":545,"slug":546,"type":15},"Diagnostics","diagnostics",{"name":517,"slug":518,"type":15},"2026-08-31T09:19:36.495282",{"slug":4,"name":4,"fn":5,"description":6,"org":550,"tags":551,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[552,553,554],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"slug":556,"name":556,"fn":557,"description":558,"org":559,"tags":560,"stars":566,"repoUrl":567,"updatedAt":568},"php-environment-check","verify PHP runtime environment configuration","Check the PHP runtime with server-info, its version, OS, and loaded extensions. Reach for it when a Mate tool itself fails or a capability is missing and you suspect the environment, a missing extension or an old PHP, rather than the app or its config. Not for diagnosing app behavior (profiler, log investigation) or DI wiring that is present but wrong (service inspection).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[561,564,565],{"name":562,"slug":563,"type":15},"Configuration","configuration",{"name":545,"slug":546,"type":15},{"name":13,"slug":14,"type":15},30,"https:\u002F\u002Fgithub.com\u002Fsymfony\u002Fai-mate","2026-08-31T09:18:44.931273",{"slug":570,"name":570,"fn":571,"description":572,"org":573,"tags":574,"stars":566,"repoUrl":567,"updatedAt":583},"system-information","inspect PHP runtime and dependency context","Resolve which dependency versions are actually installed, from composer show and composer.lock, when diagnosing version-specific behavior such as a method, argument or class that does not exist in the release that is really running. For the PHP runtime itself (version, OS, loaded extensions) use the php-environment-check skill instead.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[575,576,579,582],{"name":20,"slug":21,"type":15},{"name":577,"slug":578,"type":15},"Engineering","engineering",{"name":580,"slug":581,"type":15},"Environment Variables","environment-variables",{"name":13,"slug":14,"type":15},"2026-08-31T08:56:58.622457",6,{"items":586,"total":613},[587,594,601,607],{"slug":510,"name":510,"fn":511,"description":512,"org":588,"tags":589,"stars":22,"repoUrl":23,"updatedAt":523},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[590,591,592,593],{"name":20,"slug":21,"type":15},{"name":517,"slug":518,"type":15},{"name":520,"slug":521,"type":15},{"name":13,"slug":14,"type":15},{"slug":525,"name":525,"fn":526,"description":527,"org":595,"tags":596,"stars":22,"repoUrl":23,"updatedAt":536},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[597,598,599,600],{"name":20,"slug":21,"type":15},{"name":520,"slug":521,"type":15},{"name":533,"slug":534,"type":15},{"name":13,"slug":14,"type":15},{"slug":538,"name":538,"fn":539,"description":540,"org":602,"tags":603,"stars":22,"repoUrl":23,"updatedAt":548},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[604,605,606],{"name":20,"slug":21,"type":15},{"name":545,"slug":546,"type":15},{"name":517,"slug":518,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":608,"tags":609,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[610,611,612],{"name":17,"slug":18,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},4]