[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-symfony-symfony-log-investigation":3,"mdc-kwhs9h-key":37,"related-repo-symfony-symfony-log-investigation":657,"related-org-symfony-symfony-log-investigation":704},{"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-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},"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},"Logs","logs",{"name":23,"slug":24,"type":15},"Debugging","debugging",1159,"https:\u002F\u002Fgithub.com\u002Fsymfony\u002Fai","2026-08-31T09:18:44.585214",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\u002FMonolog\u002Fskills\u002Fsymfony-log-investigation","---\nname: symfony-log-investigation\ndescription: 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.\n---\n\n# Log investigation\n\nReads Monolog files through Mate's CLI. Entries come back as `{datetime, channel, level, message, context, extra, source_file, line_number}`. Sensitive context keys are redacted in the output but still matched when you search them.\n\n- `monolog-list-files` (opt `environment`): what log files exist, newest first.\n- `monolog-list-channels`: distinct channel names (`app`, `security`, `doctrine`, ...). Reads every file, so it is the slow one; skip it if you already know the channel.\n- `monolog-tail` (`limit`, `level`, `environment`, `channel`): most recent entries. Reads ONLY the single newest file.\n- `monolog-search` (`term`, `regex`, `level`, `channel`, `environment`, `from`, `to`, `limit`): searches across all files. Empty `term` with filters set = filter-only.\n- `monolog-context-search` (`key`, `value`, `level`, `environment`, `limit`): matches a structured context field. No channel or date filter here.\n\nThese commands accept `--format`: `json` to parse the result, `toon` (when `helgesverre\u002Ftoon` is installed) for the smallest context footprint. A wide search returns many entries, so narrow with filters and a `limit` before widening the output format.\n\n## Workflow\n\n1. Orient: `vendor\u002Fbin\u002Fmate tools:call monolog-list-files`. Confirm the environment you care about is present and recently modified.\n2. Latest state: `vendor\u002Fbin\u002Fmate tools:call monolog-tail --level=error --limit=50`. Good for \"what just broke\", nothing else.\n3. Narrow with search:\n   - `vendor\u002Fbin\u002Fmate tools:call monolog-search --term=\"Timeout\" --level=error`\n   - Time-box it: `--from=\"-1 hour\"`, `--from=2026-07-01 --to=2026-07-02`. Any PHP-parseable date works.\n   - Regex: `vendor\u002Fbin\u002Fmate tools:call monolog-search --term=\"user \\d+ locked\" --regex`. A bare pattern is wrapped as `\u002F...\u002Fi`; pass your own `\u002F...\u002F` or `#...#` to control anchoring and flags.\n4. Pivot on a field: once you have an identifier (request id, user id, order id), follow it with `vendor\u002Fbin\u002Fmate tools:call monolog-context-search --key=request_id --value=abc123`. This is how you reconstruct one request or one user across many lines.\n\n## Reading\n\n- Correlate `channel` + `level` + `datetime`. The channel tells you the subsystem (`doctrine` = DB, `security` = auth, `request`\u002F`php` = framework), the level tells you severity, the timestamp anchors it to a deploy or an incident.\n- A cluster of same-`message` errors starting at one timestamp is the onset. Use it as the `--from` to see what preceded it.\n- `source_file` + `line_number` point back into the log file, not your application code.\n\n## Failure paths\n\n- No matches: widen before concluding. Drop `--level`, widen the date window, try a shorter or partial `term`. `level` matches exactly (case-insensitive); `WARN` will not match `WARNING`.\n- Wrong channel: `--channel` is an exact (case-insensitive) name. Run `monolog-list-channels` if unsure rather than guessing.\n- `monolog-tail` looks empty or stale: it only reads the newest file. Rotated history (`prod-2026-07-01.log`) is invisible to tail; use `monolog-search` with a date range to reach it.\n- Nothing logged at all: the app may log to stderr\u002Fsyslog rather than a file, or the level threshold filters it out before it is written. The profiler `logger` collector still captures per-request logs even when file logging is quiet.\n",{"data":38,"body":39},{"name":4,"description":6},{"type":40,"children":41},"root",[42,51,66,276,320,327,444,450,547,553],{"type":43,"tag":44,"props":45,"children":47},"element","h1",{"id":46},"log-investigation",[48],{"type":49,"value":50},"text","Log investigation",{"type":43,"tag":52,"props":53,"children":54},"p",{},[55,57,64],{"type":49,"value":56},"Reads Monolog files through Mate's CLI. Entries come back as ",{"type":43,"tag":58,"props":59,"children":61},"code",{"className":60},[],[62],{"type":49,"value":63},"{datetime, channel, level, message, context, extra, source_file, line_number}",{"type":49,"value":65},". Sensitive context keys are redacted in the output but still matched when you search them.",{"type":43,"tag":67,"props":68,"children":69},"ul",{},[70,90,124,163,233],{"type":43,"tag":71,"props":72,"children":73},"li",{},[74,80,82,88],{"type":43,"tag":58,"props":75,"children":77},{"className":76},[],[78],{"type":49,"value":79},"monolog-list-files",{"type":49,"value":81}," (opt ",{"type":43,"tag":58,"props":83,"children":85},{"className":84},[],[86],{"type":49,"value":87},"environment",{"type":49,"value":89},"): what log files exist, newest first.",{"type":43,"tag":71,"props":91,"children":92},{},[93,99,101,107,109,115,116,122],{"type":43,"tag":58,"props":94,"children":96},{"className":95},[],[97],{"type":49,"value":98},"monolog-list-channels",{"type":49,"value":100},": distinct channel names (",{"type":43,"tag":58,"props":102,"children":104},{"className":103},[],[105],{"type":49,"value":106},"app",{"type":49,"value":108},", ",{"type":43,"tag":58,"props":110,"children":112},{"className":111},[],[113],{"type":49,"value":114},"security",{"type":49,"value":108},{"type":43,"tag":58,"props":117,"children":119},{"className":118},[],[120],{"type":49,"value":121},"doctrine",{"type":49,"value":123},", ...). Reads every file, so it is the slow one; skip it if you already know the channel.",{"type":43,"tag":71,"props":125,"children":126},{},[127,133,135,141,142,148,149,154,155,161],{"type":43,"tag":58,"props":128,"children":130},{"className":129},[],[131],{"type":49,"value":132},"monolog-tail",{"type":49,"value":134}," (",{"type":43,"tag":58,"props":136,"children":138},{"className":137},[],[139],{"type":49,"value":140},"limit",{"type":49,"value":108},{"type":43,"tag":58,"props":143,"children":145},{"className":144},[],[146],{"type":49,"value":147},"level",{"type":49,"value":108},{"type":43,"tag":58,"props":150,"children":152},{"className":151},[],[153],{"type":49,"value":87},{"type":49,"value":108},{"type":43,"tag":58,"props":156,"children":158},{"className":157},[],[159],{"type":49,"value":160},"channel",{"type":49,"value":162},"): most recent entries. Reads ONLY the single newest file.",{"type":43,"tag":71,"props":164,"children":165},{},[166,172,173,179,180,186,187,192,193,198,199,204,205,211,212,218,219,224,226,231],{"type":43,"tag":58,"props":167,"children":169},{"className":168},[],[170],{"type":49,"value":171},"monolog-search",{"type":49,"value":134},{"type":43,"tag":58,"props":174,"children":176},{"className":175},[],[177],{"type":49,"value":178},"term",{"type":49,"value":108},{"type":43,"tag":58,"props":181,"children":183},{"className":182},[],[184],{"type":49,"value":185},"regex",{"type":49,"value":108},{"type":43,"tag":58,"props":188,"children":190},{"className":189},[],[191],{"type":49,"value":147},{"type":49,"value":108},{"type":43,"tag":58,"props":194,"children":196},{"className":195},[],[197],{"type":49,"value":160},{"type":49,"value":108},{"type":43,"tag":58,"props":200,"children":202},{"className":201},[],[203],{"type":49,"value":87},{"type":49,"value":108},{"type":43,"tag":58,"props":206,"children":208},{"className":207},[],[209],{"type":49,"value":210},"from",{"type":49,"value":108},{"type":43,"tag":58,"props":213,"children":215},{"className":214},[],[216],{"type":49,"value":217},"to",{"type":49,"value":108},{"type":43,"tag":58,"props":220,"children":222},{"className":221},[],[223],{"type":49,"value":140},{"type":49,"value":225},"): searches across all files. Empty ",{"type":43,"tag":58,"props":227,"children":229},{"className":228},[],[230],{"type":49,"value":178},{"type":49,"value":232}," with filters set = filter-only.",{"type":43,"tag":71,"props":234,"children":235},{},[236,242,243,249,250,256,257,262,263,268,269,274],{"type":43,"tag":58,"props":237,"children":239},{"className":238},[],[240],{"type":49,"value":241},"monolog-context-search",{"type":49,"value":134},{"type":43,"tag":58,"props":244,"children":246},{"className":245},[],[247],{"type":49,"value":248},"key",{"type":49,"value":108},{"type":43,"tag":58,"props":251,"children":253},{"className":252},[],[254],{"type":49,"value":255},"value",{"type":49,"value":108},{"type":43,"tag":58,"props":258,"children":260},{"className":259},[],[261],{"type":49,"value":147},{"type":49,"value":108},{"type":43,"tag":58,"props":264,"children":266},{"className":265},[],[267],{"type":49,"value":87},{"type":49,"value":108},{"type":43,"tag":58,"props":270,"children":272},{"className":271},[],[273],{"type":49,"value":140},{"type":49,"value":275},"): matches a structured context field. No channel or date filter here.",{"type":43,"tag":52,"props":277,"children":278},{},[279,281,287,289,295,297,303,305,311,313,318],{"type":49,"value":280},"These commands accept ",{"type":43,"tag":58,"props":282,"children":284},{"className":283},[],[285],{"type":49,"value":286},"--format",{"type":49,"value":288},": ",{"type":43,"tag":58,"props":290,"children":292},{"className":291},[],[293],{"type":49,"value":294},"json",{"type":49,"value":296}," to parse the result, ",{"type":43,"tag":58,"props":298,"children":300},{"className":299},[],[301],{"type":49,"value":302},"toon",{"type":49,"value":304}," (when ",{"type":43,"tag":58,"props":306,"children":308},{"className":307},[],[309],{"type":49,"value":310},"helgesverre\u002Ftoon",{"type":49,"value":312}," is installed) for the smallest context footprint. A wide search returns many entries, so narrow with filters and a ",{"type":43,"tag":58,"props":314,"children":316},{"className":315},[],[317],{"type":49,"value":140},{"type":49,"value":319}," before widening the output format.",{"type":43,"tag":321,"props":322,"children":324},"h2",{"id":323},"workflow",[325],{"type":49,"value":326},"Workflow",{"type":43,"tag":328,"props":329,"children":330},"ol",{},[331,344,357,431],{"type":43,"tag":71,"props":332,"children":333},{},[334,336,342],{"type":49,"value":335},"Orient: ",{"type":43,"tag":58,"props":337,"children":339},{"className":338},[],[340],{"type":49,"value":341},"vendor\u002Fbin\u002Fmate tools:call monolog-list-files",{"type":49,"value":343},". Confirm the environment you care about is present and recently modified.",{"type":43,"tag":71,"props":345,"children":346},{},[347,349,355],{"type":49,"value":348},"Latest state: ",{"type":43,"tag":58,"props":350,"children":352},{"className":351},[],[353],{"type":49,"value":354},"vendor\u002Fbin\u002Fmate tools:call monolog-tail --level=error --limit=50",{"type":49,"value":356},". Good for \"what just broke\", nothing else.",{"type":43,"tag":71,"props":358,"children":359},{},[360,362],{"type":49,"value":361},"Narrow with search:\n",{"type":43,"tag":67,"props":363,"children":364},{},[365,374,394],{"type":43,"tag":71,"props":366,"children":367},{},[368],{"type":43,"tag":58,"props":369,"children":371},{"className":370},[],[372],{"type":49,"value":373},"vendor\u002Fbin\u002Fmate tools:call monolog-search --term=\"Timeout\" --level=error",{"type":43,"tag":71,"props":375,"children":376},{},[377,379,385,386,392],{"type":49,"value":378},"Time-box it: ",{"type":43,"tag":58,"props":380,"children":382},{"className":381},[],[383],{"type":49,"value":384},"--from=\"-1 hour\"",{"type":49,"value":108},{"type":43,"tag":58,"props":387,"children":389},{"className":388},[],[390],{"type":49,"value":391},"--from=2026-07-01 --to=2026-07-02",{"type":49,"value":393},". Any PHP-parseable date works.",{"type":43,"tag":71,"props":395,"children":396},{},[397,399,405,407,413,415,421,423,429],{"type":49,"value":398},"Regex: ",{"type":43,"tag":58,"props":400,"children":402},{"className":401},[],[403],{"type":49,"value":404},"vendor\u002Fbin\u002Fmate tools:call monolog-search --term=\"user \\d+ locked\" --regex",{"type":49,"value":406},". A bare pattern is wrapped as ",{"type":43,"tag":58,"props":408,"children":410},{"className":409},[],[411],{"type":49,"value":412},"\u002F...\u002Fi",{"type":49,"value":414},"; pass your own ",{"type":43,"tag":58,"props":416,"children":418},{"className":417},[],[419],{"type":49,"value":420},"\u002F...\u002F",{"type":49,"value":422}," or ",{"type":43,"tag":58,"props":424,"children":426},{"className":425},[],[427],{"type":49,"value":428},"#...#",{"type":49,"value":430}," to control anchoring and flags.",{"type":43,"tag":71,"props":432,"children":433},{},[434,436,442],{"type":49,"value":435},"Pivot on a field: once you have an identifier (request id, user id, order id), follow it with ",{"type":43,"tag":58,"props":437,"children":439},{"className":438},[],[440],{"type":49,"value":441},"vendor\u002Fbin\u002Fmate tools:call monolog-context-search --key=request_id --value=abc123",{"type":49,"value":443},". This is how you reconstruct one request or one user across many lines.",{"type":43,"tag":321,"props":445,"children":447},{"id":446},"reading",[448],{"type":49,"value":449},"Reading",{"type":43,"tag":67,"props":451,"children":452},{},[453,508,529],{"type":43,"tag":71,"props":454,"children":455},{},[456,458,463,465,470,471,477,479,484,486,491,493,499,501,506],{"type":49,"value":457},"Correlate ",{"type":43,"tag":58,"props":459,"children":461},{"className":460},[],[462],{"type":49,"value":160},{"type":49,"value":464}," + ",{"type":43,"tag":58,"props":466,"children":468},{"className":467},[],[469],{"type":49,"value":147},{"type":49,"value":464},{"type":43,"tag":58,"props":472,"children":474},{"className":473},[],[475],{"type":49,"value":476},"datetime",{"type":49,"value":478},". The channel tells you the subsystem (",{"type":43,"tag":58,"props":480,"children":482},{"className":481},[],[483],{"type":49,"value":121},{"type":49,"value":485}," = DB, ",{"type":43,"tag":58,"props":487,"children":489},{"className":488},[],[490],{"type":49,"value":114},{"type":49,"value":492}," = auth, ",{"type":43,"tag":58,"props":494,"children":496},{"className":495},[],[497],{"type":49,"value":498},"request",{"type":49,"value":500},"\u002F",{"type":43,"tag":58,"props":502,"children":504},{"className":503},[],[505],{"type":49,"value":18},{"type":49,"value":507}," = framework), the level tells you severity, the timestamp anchors it to a deploy or an incident.",{"type":43,"tag":71,"props":509,"children":510},{},[511,513,519,521,527],{"type":49,"value":512},"A cluster of same-",{"type":43,"tag":58,"props":514,"children":516},{"className":515},[],[517],{"type":49,"value":518},"message",{"type":49,"value":520}," errors starting at one timestamp is the onset. Use it as the ",{"type":43,"tag":58,"props":522,"children":524},{"className":523},[],[525],{"type":49,"value":526},"--from",{"type":49,"value":528}," to see what preceded it.",{"type":43,"tag":71,"props":530,"children":531},{},[532,538,539,545],{"type":43,"tag":58,"props":533,"children":535},{"className":534},[],[536],{"type":49,"value":537},"source_file",{"type":49,"value":464},{"type":43,"tag":58,"props":540,"children":542},{"className":541},[],[543],{"type":49,"value":544},"line_number",{"type":49,"value":546}," point back into the log file, not your application code.",{"type":43,"tag":321,"props":548,"children":550},{"id":549},"failure-paths",[551],{"type":49,"value":552},"Failure paths",{"type":43,"tag":67,"props":554,"children":555},{},[556,599,619,644],{"type":43,"tag":71,"props":557,"children":558},{},[559,561,567,569,574,576,581,583,589,591,597],{"type":49,"value":560},"No matches: widen before concluding. Drop ",{"type":43,"tag":58,"props":562,"children":564},{"className":563},[],[565],{"type":49,"value":566},"--level",{"type":49,"value":568},", widen the date window, try a shorter or partial ",{"type":43,"tag":58,"props":570,"children":572},{"className":571},[],[573],{"type":49,"value":178},{"type":49,"value":575},". ",{"type":43,"tag":58,"props":577,"children":579},{"className":578},[],[580],{"type":49,"value":147},{"type":49,"value":582}," matches exactly (case-insensitive); ",{"type":43,"tag":58,"props":584,"children":586},{"className":585},[],[587],{"type":49,"value":588},"WARN",{"type":49,"value":590}," will not match ",{"type":43,"tag":58,"props":592,"children":594},{"className":593},[],[595],{"type":49,"value":596},"WARNING",{"type":49,"value":598},".",{"type":43,"tag":71,"props":600,"children":601},{},[602,604,610,612,617],{"type":49,"value":603},"Wrong channel: ",{"type":43,"tag":58,"props":605,"children":607},{"className":606},[],[608],{"type":49,"value":609},"--channel",{"type":49,"value":611}," is an exact (case-insensitive) name. Run ",{"type":43,"tag":58,"props":613,"children":615},{"className":614},[],[616],{"type":49,"value":98},{"type":49,"value":618}," if unsure rather than guessing.",{"type":43,"tag":71,"props":620,"children":621},{},[622,627,629,635,637,642],{"type":43,"tag":58,"props":623,"children":625},{"className":624},[],[626],{"type":49,"value":132},{"type":49,"value":628}," looks empty or stale: it only reads the newest file. Rotated history (",{"type":43,"tag":58,"props":630,"children":632},{"className":631},[],[633],{"type":49,"value":634},"prod-2026-07-01.log",{"type":49,"value":636},") is invisible to tail; use ",{"type":43,"tag":58,"props":638,"children":640},{"className":639},[],[641],{"type":49,"value":171},{"type":49,"value":643}," with a date range to reach it.",{"type":43,"tag":71,"props":645,"children":646},{},[647,649,655],{"type":49,"value":648},"Nothing logged at all: the app may log to stderr\u002Fsyslog rather than a file, or the level threshold filters it out before it is written. The profiler ",{"type":43,"tag":58,"props":650,"children":652},{"className":651},[],[653],{"type":49,"value":654},"logger",{"type":49,"value":656}," collector still captures per-request logs even when file logging is quiet.",{"items":658,"total":703},[659,666,679,691],{"slug":4,"name":4,"fn":5,"description":6,"org":660,"tags":661,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[662,663,664,665],{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"slug":667,"name":667,"fn":668,"description":669,"org":670,"tags":671,"stars":25,"repoUrl":26,"updatedAt":678},"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},[672,673,674,677],{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":675,"slug":676,"type":15},"Performance","performance",{"name":17,"slug":18,"type":15},"2026-08-31T09:19:32.021005",{"slug":680,"name":680,"fn":681,"description":682,"org":683,"tags":684,"stars":25,"repoUrl":26,"updatedAt":690},"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},[685,686,689],{"name":23,"slug":24,"type":15},{"name":687,"slug":688,"type":15},"Diagnostics","diagnostics",{"name":20,"slug":21,"type":15},"2026-08-31T09:19:36.495282",{"slug":692,"name":692,"fn":693,"description":694,"org":695,"tags":696,"stars":25,"repoUrl":26,"updatedAt":702},"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},[697,700,701],{"name":698,"slug":699,"type":15},"Architecture","architecture",{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},"2026-08-31T09:18:43.894994",4,{"items":705,"total":761},[706,713,720,726,732,746],{"slug":4,"name":4,"fn":5,"description":6,"org":707,"tags":708,"stars":25,"repoUrl":26,"updatedAt":27},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[709,710,711,712],{"name":23,"slug":24,"type":15},{"name":20,"slug":21,"type":15},{"name":13,"slug":14,"type":15},{"name":17,"slug":18,"type":15},{"slug":667,"name":667,"fn":668,"description":669,"org":714,"tags":715,"stars":25,"repoUrl":26,"updatedAt":678},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[716,717,718,719],{"name":23,"slug":24,"type":15},{"name":13,"slug":14,"type":15},{"name":675,"slug":676,"type":15},{"name":17,"slug":18,"type":15},{"slug":680,"name":680,"fn":681,"description":682,"org":721,"tags":722,"stars":25,"repoUrl":26,"updatedAt":690},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[723,724,725],{"name":23,"slug":24,"type":15},{"name":687,"slug":688,"type":15},{"name":20,"slug":21,"type":15},{"slug":692,"name":692,"fn":693,"description":694,"org":727,"tags":728,"stars":25,"repoUrl":26,"updatedAt":702},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[729,730,731],{"name":698,"slug":699,"type":15},{"name":23,"slug":24,"type":15},{"name":17,"slug":18,"type":15},{"slug":733,"name":733,"fn":734,"description":735,"org":736,"tags":737,"stars":743,"repoUrl":744,"updatedAt":745},"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},[738,741,742],{"name":739,"slug":740,"type":15},"Configuration","configuration",{"name":687,"slug":688,"type":15},{"name":17,"slug":18,"type":15},30,"https:\u002F\u002Fgithub.com\u002Fsymfony\u002Fai-mate","2026-08-31T09:18:44.931273",{"slug":747,"name":747,"fn":748,"description":749,"org":750,"tags":751,"stars":743,"repoUrl":744,"updatedAt":760},"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},[752,753,756,759],{"name":23,"slug":24,"type":15},{"name":754,"slug":755,"type":15},"Engineering","engineering",{"name":757,"slug":758,"type":15},"Environment Variables","environment-variables",{"name":17,"slug":18,"type":15},"2026-08-31T08:56:58.622457",6]