[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-symfony-symfony-profiler-debugging":3,"mdc--kc9fkc-key":37,"related-org-symfony-symfony-profiler-debugging":816,"related-repo-symfony-symfony-profiler-debugging":891},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":32,"sourceUrl":35,"mdContent":36},"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},"symfony","Symfony","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fsymfony.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Observability","observability","tag",{"name":17,"slug":18,"type":15},"PHP","php",{"name":20,"slug":21,"type":15},"Performance","performance",{"name":23,"slug":24,"type":15},"Debugging","debugging",1159,"https:\u002F\u002Fgithub.com\u002Fsymfony\u002Fai","2026-08-31T09:19:32.021005",null,246,[31,18,8],"ai",{"repoUrl":26,"stars":25,"forks":29,"topics":33,"description":34},[31,18,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-profiler-debugging","---\nname: symfony-profiler-debugging\ndescription: 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).\n---\n\n# Profiler debugging\n\nReads the profiler through Mate's CLI. Two tools, two resources:\n\n- `symfony-profiler-list` filters profiles (`method`, `url`, `ip`, `statusCode`, `context`, `from`, `to`, `limit`). Newest first, so `--limit=1` is the latest. Returns summaries with a `resource_uri` per profile.\n- `symfony-profiler-get --token=\u003Ct>` returns one profile's metadata. It does NOT list collectors.\n- `symfony-profiler:\u002F\u002Fprofile\u002F{token}` lists the collectors this profile actually has, each with its URI.\n- `symfony-profiler:\u002F\u002Fprofile\u002F{token}\u002F{collector}` returns that collector, as `{name, data, summary}`. `summary` is the triage view, `data` the full detail.\n\nThese commands accept `--format`: `json` to parse the result, `toon` (when `helgesverre\u002Ftoon` is installed) for the smallest context footprint. On a large profile, prefer one of these over the human-readable default.\n\n## Workflow\n\n1. Find the profile. Do not scroll all profiles.\n   - Error: `vendor\u002Fbin\u002Fmate tools:call symfony-profiler-list --statusCode=500 --limit=5`\n   - Known URL: `--url=\u002Fcheckout`. Latest request: `--limit=1`.\n2. `vendor\u002Fbin\u002Fmate resources:read symfony-profiler:\u002F\u002Fprofile\u002F\u003Ctoken>` to see which collectors exist. Apps differ; only read what is present.\n3. Read collectors in diagnosis order, not all of them.\n\n## Reading order\n\nBranch on the symptom.\n\n**Errored (5xx \u002F exception):** read `exception` first.\n`data.class`, `message` (secrets scrubbed), `file`, `line`, and `trace` (top 10 frames) are the fix. If `has_exception` is false on an error response, the failure is upstream: check `request` for the status and `logger` for what was logged.\n\n**Slow but succeeded:** skip `exception`, go to `time`, then `db`, then `memory`.\n- `time`: `duration_ms` is total. `events` are sorted slowest first with a `category` (e.g. `doctrine`, `template`, `controller`) that tells you which subsystem ate the time. That category picks the next collector.\n- `db`: `query_count` plus `summary.duplicate_query_count`. `queries` are grouped by identical SQL, sorted by `total_time_ms`. An N+1 shows as one grouped entry with a high `count` (same statement fired in a loop), or a high `duplicate_query_count`. One slow statement shows as a high `avg_time_ms`. `sample_params` shows what was bound. Grouped list caps at 50 (`queries_truncated`).\n- `memory`: `usage_percent` against the limit. Only relevant when the request is heavy or OOMs.\n\n**Wrong output \u002F bad input:** read `request`.\n`summary` has `method`, `path`, `route`, `status_code`, `content_type`. `data` has the sanitized bags (`request_query`, `request_request`, `request_headers`, `session_attributes`). Sensitive values, the raw body, and the curl command are redacted or omitted by design, so do not expect to read a password back.\n\n**Tie a log line to the request:** `logger` has `error_count` \u002F `warning_count` \u002F `deprecation_count` and the per-request `logs` (message, level, `channel`, context; capped at 100). Use it to see what the code logged during exactly this request, which the global log files cannot pin to one request.\n\nOther collectors present in the profile (router, security, twig, ...) are readable at the same URI shape; they return raw dumps rather than a curated shape.\n\n## Failure paths\n\n- `symfony-profiler-list` returns no profiles: the profiler is off (not enabled, or prod), or nothing has been requested since it was cleared. Fall back to log investigation.\n- `symfony-profiler-get` on a stale\u002Fwrong token errors with \"Profile ... not found\". Re-list to get a live token; tokens change when the profiler storage is cleared.\n- A collector URI returns `{\"error\": ...}` instead of data: that collector is not in this profile, or the name is wrong. Re-read `symfony-profiler:\u002F\u002Fprofile\u002F{token}` for the real names.\n- The failing request was a sub-request: the profile has a `parent_token` \u002F `parent_profile`. The real exception often sits on the parent, not the fragment.\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,51,57,205,242,249,308,314,319,400,439,593,686,741,746,752],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"profiler-debugging",[48],{"type":49,"value":50},"text","Profiler debugging",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55],{"type":49,"value":56},"Reads the profiler through Mate's CLI. Two tools, two resources:",{"type":43,"tag":58,"props":59,"children":60},"ul",{},[61,148,159,170],{"type":43,"tag":62,"props":63,"children":64},"li",{},[65,72,74,80,82,88,89,95,96,102,103,109,110,116,117,123,124,130,132,138,140,146],{"type":43,"tag":66,"props":67,"children":69},"code",{"className":68},[],[70],{"type":49,"value":71},"symfony-profiler-list",{"type":49,"value":73}," filters profiles (",{"type":43,"tag":66,"props":75,"children":77},{"className":76},[],[78],{"type":49,"value":79},"method",{"type":49,"value":81},", ",{"type":43,"tag":66,"props":83,"children":85},{"className":84},[],[86],{"type":49,"value":87},"url",{"type":49,"value":81},{"type":43,"tag":66,"props":90,"children":92},{"className":91},[],[93],{"type":49,"value":94},"ip",{"type":49,"value":81},{"type":43,"tag":66,"props":97,"children":99},{"className":98},[],[100],{"type":49,"value":101},"statusCode",{"type":49,"value":81},{"type":43,"tag":66,"props":104,"children":106},{"className":105},[],[107],{"type":49,"value":108},"context",{"type":49,"value":81},{"type":43,"tag":66,"props":111,"children":113},{"className":112},[],[114],{"type":49,"value":115},"from",{"type":49,"value":81},{"type":43,"tag":66,"props":118,"children":120},{"className":119},[],[121],{"type":49,"value":122},"to",{"type":49,"value":81},{"type":43,"tag":66,"props":125,"children":127},{"className":126},[],[128],{"type":49,"value":129},"limit",{"type":49,"value":131},"). Newest first, so ",{"type":43,"tag":66,"props":133,"children":135},{"className":134},[],[136],{"type":49,"value":137},"--limit=1",{"type":49,"value":139}," is the latest. Returns summaries with a ",{"type":43,"tag":66,"props":141,"children":143},{"className":142},[],[144],{"type":49,"value":145},"resource_uri",{"type":49,"value":147}," per profile.",{"type":43,"tag":62,"props":149,"children":150},{},[151,157],{"type":43,"tag":66,"props":152,"children":154},{"className":153},[],[155],{"type":49,"value":156},"symfony-profiler-get --token=\u003Ct>",{"type":49,"value":158}," returns one profile's metadata. It does NOT list collectors.",{"type":43,"tag":62,"props":160,"children":161},{},[162,168],{"type":43,"tag":66,"props":163,"children":165},{"className":164},[],[166],{"type":49,"value":167},"symfony-profiler:\u002F\u002Fprofile\u002F{token}",{"type":49,"value":169}," lists the collectors this profile actually has, each with its URI.",{"type":43,"tag":62,"props":171,"children":172},{},[173,179,181,187,189,195,197,203],{"type":43,"tag":66,"props":174,"children":176},{"className":175},[],[177],{"type":49,"value":178},"symfony-profiler:\u002F\u002Fprofile\u002F{token}\u002F{collector}",{"type":49,"value":180}," returns that collector, as ",{"type":43,"tag":66,"props":182,"children":184},{"className":183},[],[185],{"type":49,"value":186},"{name, data, summary}",{"type":49,"value":188},". ",{"type":43,"tag":66,"props":190,"children":192},{"className":191},[],[193],{"type":49,"value":194},"summary",{"type":49,"value":196}," is the triage view, ",{"type":43,"tag":66,"props":198,"children":200},{"className":199},[],[201],{"type":49,"value":202},"data",{"type":49,"value":204}," the full detail.",{"type":43,"tag":52,"props":206,"children":207},{},[208,210,216,218,224,226,232,234,240],{"type":49,"value":209},"These commands accept ",{"type":43,"tag":66,"props":211,"children":213},{"className":212},[],[214],{"type":49,"value":215},"--format",{"type":49,"value":217},": ",{"type":43,"tag":66,"props":219,"children":221},{"className":220},[],[222],{"type":49,"value":223},"json",{"type":49,"value":225}," to parse the result, ",{"type":43,"tag":66,"props":227,"children":229},{"className":228},[],[230],{"type":49,"value":231},"toon",{"type":49,"value":233}," (when ",{"type":43,"tag":66,"props":235,"children":237},{"className":236},[],[238],{"type":49,"value":239},"helgesverre\u002Ftoon",{"type":49,"value":241}," is installed) for the smallest context footprint. On a large profile, prefer one of these over the human-readable default.",{"type":43,"tag":243,"props":244,"children":246},"h2",{"id":245},"workflow",[247],{"type":49,"value":248},"Workflow",{"type":43,"tag":250,"props":251,"children":252},"ol",{},[253,292,303],{"type":43,"tag":62,"props":254,"children":255},{},[256,258],{"type":49,"value":257},"Find the profile. Do not scroll all profiles.\n",{"type":43,"tag":58,"props":259,"children":260},{},[261,272],{"type":43,"tag":62,"props":262,"children":263},{},[264,266],{"type":49,"value":265},"Error: ",{"type":43,"tag":66,"props":267,"children":269},{"className":268},[],[270],{"type":49,"value":271},"vendor\u002Fbin\u002Fmate tools:call symfony-profiler-list --statusCode=500 --limit=5",{"type":43,"tag":62,"props":273,"children":274},{},[275,277,283,285,290],{"type":49,"value":276},"Known URL: ",{"type":43,"tag":66,"props":278,"children":280},{"className":279},[],[281],{"type":49,"value":282},"--url=\u002Fcheckout",{"type":49,"value":284},". Latest request: ",{"type":43,"tag":66,"props":286,"children":288},{"className":287},[],[289],{"type":49,"value":137},{"type":49,"value":291},".",{"type":43,"tag":62,"props":293,"children":294},{},[295,301],{"type":43,"tag":66,"props":296,"children":298},{"className":297},[],[299],{"type":49,"value":300},"vendor\u002Fbin\u002Fmate resources:read symfony-profiler:\u002F\u002Fprofile\u002F\u003Ctoken>",{"type":49,"value":302}," to see which collectors exist. Apps differ; only read what is present.",{"type":43,"tag":62,"props":304,"children":305},{},[306],{"type":49,"value":307},"Read collectors in diagnosis order, not all of them.",{"type":43,"tag":243,"props":309,"children":311},{"id":310},"reading-order",[312],{"type":49,"value":313},"Reading order",{"type":43,"tag":52,"props":315,"children":316},{},[317],{"type":49,"value":318},"Branch on the symptom.",{"type":43,"tag":52,"props":320,"children":321},{},[322,328,330,336,338,344,345,351,353,359,360,366,368,374,376,382,384,390,392,398],{"type":43,"tag":323,"props":324,"children":325},"strong",{},[326],{"type":49,"value":327},"Errored (5xx \u002F exception):",{"type":49,"value":329}," read ",{"type":43,"tag":66,"props":331,"children":333},{"className":332},[],[334],{"type":49,"value":335},"exception",{"type":49,"value":337}," first.\n",{"type":43,"tag":66,"props":339,"children":341},{"className":340},[],[342],{"type":49,"value":343},"data.class",{"type":49,"value":81},{"type":43,"tag":66,"props":346,"children":348},{"className":347},[],[349],{"type":49,"value":350},"message",{"type":49,"value":352}," (secrets scrubbed), ",{"type":43,"tag":66,"props":354,"children":356},{"className":355},[],[357],{"type":49,"value":358},"file",{"type":49,"value":81},{"type":43,"tag":66,"props":361,"children":363},{"className":362},[],[364],{"type":49,"value":365},"line",{"type":49,"value":367},", and ",{"type":43,"tag":66,"props":369,"children":371},{"className":370},[],[372],{"type":49,"value":373},"trace",{"type":49,"value":375}," (top 10 frames) are the fix. If ",{"type":43,"tag":66,"props":377,"children":379},{"className":378},[],[380],{"type":49,"value":381},"has_exception",{"type":49,"value":383}," is false on an error response, the failure is upstream: check ",{"type":43,"tag":66,"props":385,"children":387},{"className":386},[],[388],{"type":49,"value":389},"request",{"type":49,"value":391}," for the status and ",{"type":43,"tag":66,"props":393,"children":395},{"className":394},[],[396],{"type":49,"value":397},"logger",{"type":49,"value":399}," for what was logged.",{"type":43,"tag":52,"props":401,"children":402},{},[403,408,410,415,417,423,425,431,432,438],{"type":43,"tag":323,"props":404,"children":405},{},[406],{"type":49,"value":407},"Slow but succeeded:",{"type":49,"value":409}," skip ",{"type":43,"tag":66,"props":411,"children":413},{"className":412},[],[414],{"type":49,"value":335},{"type":49,"value":416},", go to ",{"type":43,"tag":66,"props":418,"children":420},{"className":419},[],[421],{"type":49,"value":422},"time",{"type":49,"value":424},", then ",{"type":43,"tag":66,"props":426,"children":428},{"className":427},[],[429],{"type":49,"value":430},"db",{"type":49,"value":424},{"type":43,"tag":66,"props":433,"children":435},{"className":434},[],[436],{"type":49,"value":437},"memory",{"type":49,"value":291},{"type":43,"tag":58,"props":440,"children":441},{},[442,497,576],{"type":43,"tag":62,"props":443,"children":444},{},[445,450,451,457,459,465,467,473,475,481,482,488,489,495],{"type":43,"tag":66,"props":446,"children":448},{"className":447},[],[449],{"type":49,"value":422},{"type":49,"value":217},{"type":43,"tag":66,"props":452,"children":454},{"className":453},[],[455],{"type":49,"value":456},"duration_ms",{"type":49,"value":458}," is total. ",{"type":43,"tag":66,"props":460,"children":462},{"className":461},[],[463],{"type":49,"value":464},"events",{"type":49,"value":466}," are sorted slowest first with a ",{"type":43,"tag":66,"props":468,"children":470},{"className":469},[],[471],{"type":49,"value":472},"category",{"type":49,"value":474}," (e.g. ",{"type":43,"tag":66,"props":476,"children":478},{"className":477},[],[479],{"type":49,"value":480},"doctrine",{"type":49,"value":81},{"type":43,"tag":66,"props":483,"children":485},{"className":484},[],[486],{"type":49,"value":487},"template",{"type":49,"value":81},{"type":43,"tag":66,"props":490,"children":492},{"className":491},[],[493],{"type":49,"value":494},"controller",{"type":49,"value":496},") that tells you which subsystem ate the time. That category picks the next collector.",{"type":43,"tag":62,"props":498,"children":499},{},[500,505,506,512,514,520,521,527,529,535,537,543,545,551,553,559,560,566,568,574],{"type":43,"tag":66,"props":501,"children":503},{"className":502},[],[504],{"type":49,"value":430},{"type":49,"value":217},{"type":43,"tag":66,"props":507,"children":509},{"className":508},[],[510],{"type":49,"value":511},"query_count",{"type":49,"value":513}," plus ",{"type":43,"tag":66,"props":515,"children":517},{"className":516},[],[518],{"type":49,"value":519},"summary.duplicate_query_count",{"type":49,"value":188},{"type":43,"tag":66,"props":522,"children":524},{"className":523},[],[525],{"type":49,"value":526},"queries",{"type":49,"value":528}," are grouped by identical SQL, sorted by ",{"type":43,"tag":66,"props":530,"children":532},{"className":531},[],[533],{"type":49,"value":534},"total_time_ms",{"type":49,"value":536},". An N+1 shows as one grouped entry with a high ",{"type":43,"tag":66,"props":538,"children":540},{"className":539},[],[541],{"type":49,"value":542},"count",{"type":49,"value":544}," (same statement fired in a loop), or a high ",{"type":43,"tag":66,"props":546,"children":548},{"className":547},[],[549],{"type":49,"value":550},"duplicate_query_count",{"type":49,"value":552},". One slow statement shows as a high ",{"type":43,"tag":66,"props":554,"children":556},{"className":555},[],[557],{"type":49,"value":558},"avg_time_ms",{"type":49,"value":188},{"type":43,"tag":66,"props":561,"children":563},{"className":562},[],[564],{"type":49,"value":565},"sample_params",{"type":49,"value":567}," shows what was bound. Grouped list caps at 50 (",{"type":43,"tag":66,"props":569,"children":571},{"className":570},[],[572],{"type":49,"value":573},"queries_truncated",{"type":49,"value":575},").",{"type":43,"tag":62,"props":577,"children":578},{},[579,584,585,591],{"type":43,"tag":66,"props":580,"children":582},{"className":581},[],[583],{"type":49,"value":437},{"type":49,"value":217},{"type":43,"tag":66,"props":586,"children":588},{"className":587},[],[589],{"type":49,"value":590},"usage_percent",{"type":49,"value":592}," against the limit. Only relevant when the request is heavy or OOMs.",{"type":43,"tag":52,"props":594,"children":595},{},[596,601,602,607,609,614,616,621,622,628,629,635,636,642,643,649,650,655,657,663,664,670,671,677,678,684],{"type":43,"tag":323,"props":597,"children":598},{},[599],{"type":49,"value":600},"Wrong output \u002F bad input:",{"type":49,"value":329},{"type":43,"tag":66,"props":603,"children":605},{"className":604},[],[606],{"type":49,"value":389},{"type":49,"value":608},".\n",{"type":43,"tag":66,"props":610,"children":612},{"className":611},[],[613],{"type":49,"value":194},{"type":49,"value":615}," has ",{"type":43,"tag":66,"props":617,"children":619},{"className":618},[],[620],{"type":49,"value":79},{"type":49,"value":81},{"type":43,"tag":66,"props":623,"children":625},{"className":624},[],[626],{"type":49,"value":627},"path",{"type":49,"value":81},{"type":43,"tag":66,"props":630,"children":632},{"className":631},[],[633],{"type":49,"value":634},"route",{"type":49,"value":81},{"type":43,"tag":66,"props":637,"children":639},{"className":638},[],[640],{"type":49,"value":641},"status_code",{"type":49,"value":81},{"type":43,"tag":66,"props":644,"children":646},{"className":645},[],[647],{"type":49,"value":648},"content_type",{"type":49,"value":188},{"type":43,"tag":66,"props":651,"children":653},{"className":652},[],[654],{"type":49,"value":202},{"type":49,"value":656}," has the sanitized bags (",{"type":43,"tag":66,"props":658,"children":660},{"className":659},[],[661],{"type":49,"value":662},"request_query",{"type":49,"value":81},{"type":43,"tag":66,"props":665,"children":667},{"className":666},[],[668],{"type":49,"value":669},"request_request",{"type":49,"value":81},{"type":43,"tag":66,"props":672,"children":674},{"className":673},[],[675],{"type":49,"value":676},"request_headers",{"type":49,"value":81},{"type":43,"tag":66,"props":679,"children":681},{"className":680},[],[682],{"type":49,"value":683},"session_attributes",{"type":49,"value":685},"). Sensitive values, the raw body, and the curl command are redacted or omitted by design, so do not expect to read a password back.",{"type":43,"tag":52,"props":687,"children":688},{},[689,694,696,701,702,708,710,716,717,723,725,731,733,739],{"type":43,"tag":323,"props":690,"children":691},{},[692],{"type":49,"value":693},"Tie a log line to the request:",{"type":49,"value":695}," ",{"type":43,"tag":66,"props":697,"children":699},{"className":698},[],[700],{"type":49,"value":397},{"type":49,"value":615},{"type":43,"tag":66,"props":703,"children":705},{"className":704},[],[706],{"type":49,"value":707},"error_count",{"type":49,"value":709}," \u002F ",{"type":43,"tag":66,"props":711,"children":713},{"className":712},[],[714],{"type":49,"value":715},"warning_count",{"type":49,"value":709},{"type":43,"tag":66,"props":718,"children":720},{"className":719},[],[721],{"type":49,"value":722},"deprecation_count",{"type":49,"value":724}," and the per-request ",{"type":43,"tag":66,"props":726,"children":728},{"className":727},[],[729],{"type":49,"value":730},"logs",{"type":49,"value":732}," (message, level, ",{"type":43,"tag":66,"props":734,"children":736},{"className":735},[],[737],{"type":49,"value":738},"channel",{"type":49,"value":740},", context; capped at 100). Use it to see what the code logged during exactly this request, which the global log files cannot pin to one request.",{"type":43,"tag":52,"props":742,"children":743},{},[744],{"type":49,"value":745},"Other collectors present in the profile (router, security, twig, ...) are readable at the same URI shape; they return raw dumps rather than a curated shape.",{"type":43,"tag":243,"props":747,"children":749},{"id":748},"failure-paths",[750],{"type":49,"value":751},"Failure paths",{"type":43,"tag":58,"props":753,"children":754},{},[755,765,776,796],{"type":43,"tag":62,"props":756,"children":757},{},[758,763],{"type":43,"tag":66,"props":759,"children":761},{"className":760},[],[762],{"type":49,"value":71},{"type":49,"value":764}," returns no profiles: the profiler is off (not enabled, or prod), or nothing has been requested since it was cleared. Fall back to log investigation.",{"type":43,"tag":62,"props":766,"children":767},{},[768,774],{"type":43,"tag":66,"props":769,"children":771},{"className":770},[],[772],{"type":49,"value":773},"symfony-profiler-get",{"type":49,"value":775}," on a stale\u002Fwrong token errors with \"Profile ... not found\". Re-list to get a live token; tokens change when the profiler storage is cleared.",{"type":43,"tag":62,"props":777,"children":778},{},[779,781,787,789,794],{"type":49,"value":780},"A collector URI returns ",{"type":43,"tag":66,"props":782,"children":784},{"className":783},[],[785],{"type":49,"value":786},"{\"error\": ...}",{"type":49,"value":788}," instead of data: that collector is not in this profile, or the name is wrong. Re-read ",{"type":43,"tag":66,"props":790,"children":792},{"className":791},[],[793],{"type":49,"value":167},{"type":49,"value":795}," for the real names.",{"type":43,"tag":62,"props":797,"children":798},{},[799,801,807,808,814],{"type":49,"value":800},"The failing request was a sub-request: the profile has a ",{"type":43,"tag":66,"props":802,"children":804},{"className":803},[],[805],{"type":49,"value":806},"parent_token",{"type":49,"value":709},{"type":43,"tag":66,"props":809,"children":811},{"className":810},[],[812],{"type":49,"value":813},"parent_profile",{"type":49,"value":815},". The real exception often sits on the parent, not the fragment.",{"items":817,"total":890},[818,830,837,849,861,875],{"slug":819,"name":819,"fn":820,"description":821,"org":822,"tags":823,"stars":25,"repoUrl":26,"updatedAt":829},"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},[824,825,827,828],{"name":23,"slug":24,"type":15},{"name":826,"slug":730,"type":15},"Logs",{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},"2026-08-31T09:18:44.585214",{"slug":4,"name":4,"fn":5,"description":6,"org":831,"tags":832,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[833,834,835,836],{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"slug":838,"name":838,"fn":839,"description":840,"org":841,"tags":842,"stars":25,"repoUrl":26,"updatedAt":848},"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},[843,844,847],{"name":23,"slug":24,"type":15},{"name":845,"slug":846,"type":15},"Diagnostics","diagnostics",{"name":826,"slug":730,"type":15},"2026-08-31T09:19:36.495282",{"slug":850,"name":850,"fn":851,"description":852,"org":853,"tags":854,"stars":25,"repoUrl":26,"updatedAt":860},"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},[855,858,859],{"name":856,"slug":857,"type":15},"Architecture","architecture",{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},"2026-08-31T09:18:43.894994",{"slug":862,"name":862,"fn":863,"description":864,"org":865,"tags":866,"stars":872,"repoUrl":873,"updatedAt":874},"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},[867,870,871],{"name":868,"slug":869,"type":15},"Configuration","configuration",{"name":845,"slug":846,"type":15},{"name":17,"slug":18,"type":15},30,"https:\u002F\u002Fgithub.com\u002Fsymfony\u002Fai-mate","2026-08-31T09:18:44.931273",{"slug":876,"name":876,"fn":877,"description":878,"org":879,"tags":880,"stars":872,"repoUrl":873,"updatedAt":889},"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},[881,882,885,888],{"name":23,"slug":24,"type":15},{"name":883,"slug":884,"type":15},"Engineering","engineering",{"name":886,"slug":887,"type":15},"Environment Variables","environment-variables",{"name":17,"slug":18,"type":15},"2026-08-31T08:56:58.622457",6,{"items":892,"total":919},[893,900,907,913],{"slug":819,"name":819,"fn":820,"description":821,"org":894,"tags":895,"stars":25,"repoUrl":26,"updatedAt":829},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[896,897,898,899],{"name":23,"slug":24,"type":15},{"name":826,"slug":730,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"slug":4,"name":4,"fn":5,"description":6,"org":901,"tags":902,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[903,904,905,906],{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"slug":838,"name":838,"fn":839,"description":840,"org":908,"tags":909,"stars":25,"repoUrl":26,"updatedAt":848},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[910,911,912],{"name":23,"slug":24,"type":15},{"name":845,"slug":846,"type":15},{"name":826,"slug":730,"type":15},{"slug":850,"name":850,"fn":851,"description":852,"org":914,"tags":915,"stars":25,"repoUrl":26,"updatedAt":860},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[916,917,918],{"name":856,"slug":857,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},4]