{"id":"17f920a2-e46c-450d-88d3-c8a99bf4774c","shortId":"XMYaLw","kind":"skill","title":"self-review","tagline":"Use when about to commit, finish a task, open a PR, summarize work for the user, or when the user asks for a review or summary — NOT just on autonomous commits, which are rare in OpenCode usage","description":"# Pre-Commit Self-Review\n\n## Overview\n\n**Pause and read what you wrote as a stranger would before claiming completion.** This skill covers review of your own work. For domain-specific review of any code (security, correctness, API quality), invoke the matching domain skill.\n\nRun the checklist in order. If you can't satisfy a step, fix it or call it out in your summary.\n\n## When to invoke\n\nInvoke when you're about to:\n\n- Run `git commit` (autonomous or otherwise)\n- Tell your human partner \"I'm done\" or \"ready for review\"\n- Open or update a pull request\n- Summarize a chunk of work, hand off to another agent, or close out a task\n- Be asked by your human partner to review, sanity-check, or hand off the change\n\nIn OpenCode and similar agent harnesses, commits are usually initiated by the user, not the agent. The trigger is therefore **the moment of completion**, not specifically the moment of `git commit` — whichever comes first.\n\n### Non-triggers — do NOT invoke for\n\n- Mid-implementation edits: this skill fires at the end of a unit of work, not in the middle of one\n- Single-line fixes — typo, comment, formatter-only change — where there is no review surface\n- Exploratory or read-only tasks (reading code, answering a question, writing a summary with no code change)\n- Routine save points during a long task where you are not yet claiming completion\n- Reverts and mechanical undo operations\n\nIf the change is small but introduces real logic, **invoke anyway** — the checklist is short.\n\n## Self-review checklist\n\nRun every step before you commit, hand off, or claim completion.\n\n1. **Re-read the diff as a stranger, and scan ±20 lines around every hunk for unsafe code.** Open the diff fresh and read it top to bottom without context. If a section needs you to remember what you were thinking yesterday to make sense of it, the next reader will not have that memory — rename, comment, or restructure until the diff explains itself. Then, in the same pass, read the **20 lines above and below each hunk** in every touched file and look for these six unsafe patterns in the surrounding code, whether or not your change introduced them:\n   - **Hardcoded credentials.** String literals that look like API keys, OAuth client secrets, database passwords, JWT signing secrets, bearer tokens, private keys (`-----BEGIN`), or connection strings with embedded passwords — assigned to a variable, passed as an argument, or written into a config file.\n   - **String-built SQL, LDAP, or shell commands.** F-strings, `+` concatenation, or `.format()` building a query/command string with interpolated values; `subprocess.run(..., shell=True)` with non-constant input.\n   - **Unsafe deserialization on untrusted input.** `pickle.loads`, `yaml.load` without `SafeLoader`, `marshal.loads`, Java `ObjectInputStream`, PHP `unserialize`, .NET `BinaryFormatter` against data that crosses a trust boundary.\n   - **Swallowed exceptions.** Broad `except:` / `except Exception:` / `catch (Throwable)` blocks with `pass`, an empty body, or a comment-only body — the call site silently absorbs failures the caller cannot see.\n   - **TOCTOU patterns.** Check-then-use against the same path or resource (`if os.path.exists(p): open(p)`, `if user.has_permission(x): do(x)`) where the state can change between check and use.\n   - **Mutable default arguments.** `def f(x=[])`, `def f(x={})`, `def f(x=set())` — the default is shared across calls and accumulates state.\n\n   **Test fixtures, mocks, and example values inside `tests/`, `test_*.py`, `*.spec.*`, `fixtures/`, or files with names containing `mock`, `fake`, or `stub` are intentional test data, not unsafe code.** Skip them.\n\n   When you find one of these in the surrounding code (not in your diff), **surface it in your summary to the user — do not silently rewrite the file outside the scope you were asked to change.** Add an `Adjacent issues` line to your summary naming the file, line, and pattern (e.g. `Adjacent issues: src/billing/charge.py:142 — string-built SQL with f-string interpolation`). If you find none, say so explicitly: `Adjacent issues: none found in ±20 lines of touched hunks.` The named artifact is the verification — agents that skipped the scan have nothing to write on this line. *(Rising, 97/58.)*\n2. **Suspect your own code first.** Before you blame the framework, the library, or the flaky test, assume the bug is yours. It almost always is. Walk the code path with the failing input in mind; confirm assumptions about types, ordering, null cases, and shared state. Reach for \"compiler bug\" only after you have ruled out yours. *(Kelly, 97/9.)*\n3. **Know what your next commit is.** State, in one sentence, what this commit does. If the sentence contains \"and also\" or \"various\", the commit is two commits. Split it. If you cannot name a clear, bounded change, you are committing speculation — throw the speculative parts away and re-scope. *(Bergh Johnsson, 97/47.)*\n4. **Check for deliberate technical debt.** Did you take a shortcut to ship? Name it. File a follow-up note (issue, todo, line in your summary) so the debt is visible. Untracked debt accrues silent interest. *(Rose, 97/1.)*\n5. **Clean the build before you leave it.** New compiler warnings, lint errors, or deprecation notices introduced by this change get fixed now, not later. A noisy build hides the warning that actually matters. *(Brodwall, 97/42.)*\n6. **Audit the logs you added.** Every new log line: is its level right? Will it fire once per significant event, or per inner-loop iteration? Would you want to be paged for an ERROR-level message you wrote? If not, downgrade it. *(Brodwall, 97/90.)*\n7. **Re-read the comments.** Header comments should let the next reader use the code without reading the body. Inline comments should explain *why*, not narrate *what*. Delete comments that have drifted from the code. Never paste anything into a comment you would not want quoted back in a meeting. *(Evans, 97/16.)*\n8. **Frame your summary as a review, not a defense.** When you summarize for the user, mention the trade-offs, the parts you are least sure about, and any debt you incurred. Reviews exist for knowledge sharing, not for catching you out — invite scrutiny rather than deflect it. *(Karlsson, 97/14.)*\n\n## Red Flags\n\nThese thoughts mean STOP — do not commit yet:\n\n| Thought | Reality |\n|---|---|\n| \"It works on my machine — shipping it.\" | \"Works\" is the verification gate, not the review gate. Re-read the diff as a stranger before claiming done. (97/58) |\n| \"I'll skip the ±20 line scan — my diff doesn't touch security code.\" | The point of the scan is to find unsafe code you didn't author. Hardcoded credentials, string-built SQL, and unsafe deserialization in code adjacent to your edit will ship under your name if you don't surface them. The `Adjacent issues:` line is mandatory; \"none found\" is a valid value, \"I didn't look\" is not. (97/58) |\n| \"Must be a bug in the library.\" | Mature libraries used by many people are usually fine. Suspect your code first; reach for \"library bug\" only after ruling yours out. (97/9) |\n| \"I'll squash this giant commit and figure out the message later.\" | If you can't state the commit in one sentence now, the commit is speculation. Split it or throw the speculative parts away. (97/47) |\n| \"I took a shortcut, I'll come back and fix it.\" | The promise is sincere and rarely kept. Track the debt explicitly — issue, todo, summary note — or pay it now. (97/1) |\n| \"There are a few new warnings, but the build still passes.\" | Today's ignored warning hides tomorrow's real one. Fix warnings as they appear, not in a future cleanup pass. (97/42) |\n| \"More logging is safer.\" | A log flooded with INFO drowns the ERROR that wakes you at 3am. Audit log levels before committing. (97/90) |\n| \"The code is obvious, no comments needed.\" | Obvious to you today is opaque to the next reader. Header comment for *how to use*, inline comment for *why*. (97/16) |\n| \"I'll just downplay the messy parts in the summary.\" | The summary is for knowledge sharing, not self-defense. Name the trade-offs and the parts you're unsure about. (97/14) |\n\n## What \"done\" looks like\n\nYou are done when **all** of the following are true:\n\n- [ ] You ruled out your own code as the source of any unresolved oddness before blaming external systems.\n- [ ] The diff was re-read top-to-bottom as a stranger, and the ±20 lines around every hunk were scanned for the six unsafe patterns (hardcoded credentials, string-built SQL/shell, unsafe deserialization, swallowed exceptions, TOCTOU, mutable default).\n- [ ] The summary contains an `Adjacent issues:` line — either naming surfaced issues (file, line, pattern) or stating `none found` after an actual scan.\n- [ ] The commit (or summary) can be described in one sentence with no \"and also.\"\n- [ ] Any shortcut taken is named in a tracked follow-up.\n- [ ] Build is clean — no new warnings, lint errors, or deprecation notices introduced.\n- [ ] New log lines have correct levels and reasonable volume.\n- [ ] The summary names trade-offs and uncertainties rather than hiding them.\n\nIf any box is unchecked, you are not done. Either finish the review, or hand back with the gaps named explicitly.\n\n## Principles in this skill\n\n| # | Principle | Author |\n|---|---|---|\n| 97/1 | Act with Prudence | Seb Rose |\n| 97/9 | Check Your Code First Before Looking to Blame Others | Allan Kelly |\n| 97/14 | Code Reviews | Mattias Karlsson |\n| 97/16 | A Comment on Comments | Cal Evans |\n| 97/42 | Keep the Build Clean | Johannes Brodwall |\n| 97/47 | Know Your Next Commit | Dan Bergh Johnsson |\n| 97/58 | A Message to the Future | Linda Rising |\n| 97/69 | Put the Mouse Down and Step Away from the Keyboard | Burk Hufnagel |\n| 97/90 | Verbose Logging Will Disturb Your Sleep | Johannes Brodwall |\n\nSee `principles.md` for the long-form distillations, citations, and source links.","tags":["self","review","oribarilan","agent-skills","ai-agents","best-practices","claude-code","claude-code-plugin","claude-code-skills","coding-agents","copilot-cli","copilot-cli-plugin"],"capabilities":["skill","source-oribarilan","skill-self-review","topic-agent-skills","topic-ai-agents","topic-best-practices","topic-claude-code","topic-claude-code-plugin","topic-claude-code-skills","topic-coding-agents","topic-copilot-cli","topic-copilot-cli-plugin","topic-opencode","topic-opencode-plugin","topic-programming-principles"],"categories":["97"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/oribarilan/97/self-review","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add oribarilan/97","source_repo":"https://github.com/oribarilan/97","install_from":"skills.sh"}},"qualityScore":"0.460","qualityRationale":"deterministic score 0.46 from registry signals: · indexed on github topic:agent-skills · 21 github stars · SKILL.md body (9,887 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:05:33.090Z","embedding":null,"createdAt":"2026-05-10T19:04:20.401Z","updatedAt":"2026-05-18T19:05:33.090Z","lastSeenAt":"2026-05-18T19:05:33.090Z","tsv":"'1':315 '142':678 '2':725 '20':326,387,700,1108,1436 '3':784 '3am':1322 '4':838 '5':877 '6':913 '7':960 '8':1013 '97/1':876,1273,1568 '97/14':1063,1389,1586 '97/16':1012,1356,1591 '97/42':912,1305,1598 '97/47':837,1242,1605 '97/58':724,1103,1176,1613 '97/69':1621 '97/9':783,1206,1574 '97/90':959,1328,1634 'absorb':534 'accru':872 'accumul':592 'across':589 'act':1569 'actual':909,1481 'ad':918 'add':660 'adjac':662,675,695,1143,1159,1465 'agent':148,174,185,711 'allan':1584 'almost':748 'also':804,1496 'alway':749 'anoth':147 'answer':256 'anyth':998 'anyway':295 'api':79,423 'appear':1298 'argument':451,574 'around':328,1438 'artifact':707 'ask':24,155,657 'assign':444 'assum':742 'assumpt':762 'audit':914,1323 'author':1131,1567 'autonom':33,119 'away':830,1241,1628 'back':1007,1250,1556 'bearer':433 'begin':437 'bergh':835,1611 'binaryformatt':502 'blame':733,1418,1582 'block':518 'bodi':523,529,979 'bottom':343,1430 'bound':820 'boundari':509 'box':1543 'broad':512 'brodwal':911,958,1604,1642 'bug':744,774,1180,1200 'build':472,880,904,1282,1508,1601 'built':460,681,1136,1452 'burk':1632 'cal':1596 'call':101,531,590 'caller':537 'cannot':538,816 'case':767 'catch':516,1053 'chang':169,241,265,287,413,567,659,821,896 'check':164,543,569,839,1575 'check-then-us':542 'checklist':88,297,303 'chunk':141 'citat':1651 'claim':59,278,313,1101 'clean':878,1510,1602 'cleanup':1303 'clear':819 'client':426 'close':150 'code':76,255,264,333,408,621,633,729,753,975,995,1117,1127,1142,1195,1330,1409,1577,1587 'come':202,1249 'command':465 'comment':237,372,527,965,967,981,989,1001,1334,1347,1353,1593,1595 'comment-on':526 'commit':8,34,43,118,176,200,309,789,797,808,811,824,1072,1212,1225,1231,1327,1484,1609 'compil':773,886 'complet':60,193,279,314 'concaten':469 'config':456 'confirm':761 'connect':439 'constant':485 'contain':610,802,1463 'context':345 'correct':78,1524 'cover':63 'credenti':417,1133,1449 'cross':506 'dan':1610 'data':504,618 'databas':428 'debt':843,867,871,1043,1263 'def':575,578,581 'default':573,586,1460 'defens':1022,1376 'deflect':1060 'delet':988 'deliber':841 'deprec':891,1517 'describ':1489 'deseri':488,1140,1455 'didn':1129,1171 'diff':320,336,377,637,1096,1112,1422 'distil':1650 'disturb':1638 'doesn':1113 'domain':71,84 'domain-specif':70 'done':128,1102,1391,1396,1549 'downgrad':956 'downplay':1360 'drift':992 'drown':1315 'e.g':674 'edit':214,1146 'either':1468,1550 'embed':442 'empti':522 'end':220 'error':889,949,1317,1515 'error-level':948 'evan':1011,1597 'event':933 'everi':305,329,395,919,1439 'exampl':598 'except':511,513,514,515,1457 'exist':1047 'explain':378,983 'explicit':694,1264,1561 'exploratori':248 'extern':1419 'f':467,576,579,582,685 'f-string':466,684 'fail':757 'failur':535 'fake':612 'figur':1214 'file':397,457,607,651,670,853,1472 'find':626,690,1125 'fine':1192 'finish':9,1551 'fire':217,929 'first':203,730,1196,1578 'fix':98,235,898,1252,1294 'fixtur':595,605 'flag':1065 'flaki':740 'flood':1312 'follow':856,1401,1506 'follow-up':855,1505 'form':1649 'format':471 'formatt':239 'formatter-on':238 'found':698,1165,1478 'frame':1014 'framework':735 'fresh':337 'futur':1302,1618 'gap':1559 'gate':1087,1091 'get':897 'giant':1211 'git':117,199 'hand':144,166,310,1555 'har':175 'hardcod':416,1132,1448 'header':966,1346 'hide':905,1289,1539 'hufnagel':1633 'human':124,158 'hunk':330,393,704,1440 'ignor':1287 'implement':213 'incur':1045 'info':1314 'initi':179 'inlin':980,1352 'inner':937 'inner-loop':936 'input':486,491,758 'insid':600 'intent':616 'interest':874 'interpol':477,687 'introduc':291,414,893,1519 'invit':1056 'invok':81,109,110,209,294 'issu':663,676,696,859,1160,1265,1466,1471 'iter':939 'java':497 'johann':1603,1641 'johnsson':836,1612 'jwt':430 'karlsson':1062,1590 'keep':1599 'kelli':782,1585 'kept':1260 'key':424,436 'keyboard':1631 'know':785,1606 'knowledg':1049,1371 'later':901,1218 'ldap':462 'least':1038 'leav':883 'let':969 'level':925,950,1325,1525 'librari':737,1183,1185,1199 'like':422,1393 'linda':1619 'line':234,327,388,664,671,701,722,861,922,1109,1161,1437,1467,1473,1522 'link':1654 'lint':888,1514 'liter':419 'll':1105,1208,1248,1358 'log':916,921,1307,1311,1324,1521,1636 'logic':293 'long':271,1648 'long-form':1647 'look':399,421,1173,1392,1580 'loop':938 'm':127 'machin':1080 'make':359 'mandatori':1163 'mani':1188 'marshal.loads':496 'match':83 'matter':910 'mattia':1589 'matur':1184 'mean':1068 'mechan':282 'meet':1010 'memori':370 'mention':1029 'messag':951,1217,1615 'messi':1362 'mid':212 'mid-implement':211 'middl':229 'mind':760 'mock':596,611 'moment':191,197 'mous':1624 'must':1177 'mutabl':572,1459 'name':609,668,706,817,851,1151,1377,1469,1501,1531,1560 'narrat':986 'need':349,1335 'net':501 'never':996 'new':885,920,1278,1512,1520 'next':364,788,971,1344,1608 'noisi':903 'non':205,484 'non-const':483 'non-trigg':204 'none':691,697,1164,1477 'note':858,1268 'noth':717 'notic':892,1518 'null':766 'oauth':425 'objectinputstream':498 'obvious':1332,1336 'odd':1416 'off':1033,1381,1534 'one':231,627,793,1227,1293,1491 'opaqu':1341 'open':12,133,334,555 'opencod':39,171 'oper':284 'order':90,765 'os.path.exists':553 'other':1583 'otherwis':121 'outsid':652 'overview':47 'p':554,556 'page':945 'part':829,1035,1240,1363,1384 'partner':125,159 'pass':384,448,520,1284,1304 'password':429,443 'past':997 'path':549,754 'pattern':404,541,673,1447,1474 'paus':48 'pay':1270 'peopl':1189 'per':931,935 'permiss':559 'php':499 'pickle.loads':492 'point':268,1119 'pr':14 'pre':42 'pre-commit':41 'principl':1562,1566 'principles.md':1644 'privat':435 'promis':1255 'prudenc':1571 'pull':137 'put':1622 'py':603 'qualiti':80 'query/command':474 'question':258 'quot':1006 'rare':37,1259 'rather':1058,1537 're':113,317,833,962,1093,1386,1425 're-read':316,961,1092,1424 're-scop':832 'reach':771,1197 'read':50,251,254,318,339,385,963,977,1094,1426 'read-on':250 'reader':365,972,1345 'readi':130 'real':292,1292 'realiti':1075 'reason':1527 'red':1064 'rememb':352 'renam':371 'request':138 'resourc':551 'restructur':374 'revert':280 'review':3,27,46,64,73,132,161,246,302,1019,1046,1090,1553,1588 'rewrit':649 'right':926 'rise':723,1620 'rose':875,1573 'routin':266 'rule':779,1203,1405 'run':86,116,304 'safeload':495 'safer':1309 'saniti':163 'sanity-check':162 'satisfi':95 'save':267 'say':692 'scan':325,715,1110,1122,1442,1482 'scope':654,834 'scrutini':1057 'seb':1572 'secret':427,432 'section':348 'secur':77,1116 'see':539,1643 'self':2,45,301,1375 'self-defens':1374 'self-review':1,44,300 'sens':360 'sentenc':794,801,1228,1492 'set':584 'share':588,769,1050,1372 'shell':464,480 'ship':850,1081,1148 'short':299 'shortcut':848,1246,1498 'sign':431 'signific':932 'silent':533,648,873 'similar':173 'sincer':1257 'singl':233 'single-lin':232 'site':532 'six':402,1445 'skill':62,85,216,1565 'skill-self-review' 'skip':622,713,1106 'sleep':1640 'small':289 'sourc':1412,1653 'source-oribarilan' 'spec':604 'specif':72,195 'specul':825,828,1233,1239 'split':812,1234 'sql':461,682,1137 'sql/shell':1453 'squash':1209 'src/billing/charge.py':677 'state':565,593,770,791,1223,1476 'step':97,306,1627 'still':1283 'stop':1069 'stranger':56,323,1099,1433 'string':418,440,459,468,475,680,686,1135,1451 'string-built':458,679,1134,1450 'stub':614 'subprocess.run':479 'summar':15,139,1025 'summari':29,106,261,642,667,864,1016,1267,1366,1368,1462,1486,1530 'sure':1039 'surfac':247,638,1156,1470 'surround':407,632 'suspect':726,1193 'swallow':510,1456 'system':1420 'take':846 'taken':1499 'task':11,153,253,272 'technic':842 'tell':122 'test':594,601,602,617,741 'therefor':189 'think':356 'thought':1067,1074 'throw':826,1237 'throwabl':517 'toctou':540,1458 'today':1285,1339 'todo':860,1266 'token':434 'tomorrow':1290 'took':1244 'top':341,1428 'top-to-bottom':1427 'topic-agent-skills' 'topic-ai-agents' 'topic-best-practices' 'topic-claude-code' 'topic-claude-code-plugin' 'topic-claude-code-skills' 'topic-coding-agents' 'topic-copilot-cli' 'topic-copilot-cli-plugin' 'topic-opencode' 'topic-opencode-plugin' 'topic-programming-principles' 'touch':396,703,1115 'track':1261,1504 'trade':1032,1380,1533 'trade-off':1031,1379,1532 'trigger':187,206 'true':481,1403 'trust':508 'two':810 'type':764 'typo':236 'uncertainti':1536 'uncheck':1545 'undo':283 'unit':223 'unresolv':1415 'unsaf':332,403,487,620,1126,1139,1446,1454 'unseri':500 'unsur':1387 'untrack':870 'untrust':490 'updat':135 'usag':40 'use':4,545,571,973,1186,1351 'user':19,23,182,645,1028 'user.has':558 'usual':178,1191 'valid':1168 'valu':478,599,1169 'variabl':447 'various':806 'verbos':1635 'verif':710,1086 'visibl':869 'volum':1528 'wake':1319 'walk':751 'want':942,1005 'warn':887,907,1279,1288,1295,1513 'whether':409 'whichev':201 'without':344,494,976 'work':16,68,143,225,1077,1083 'would':57,940,1003 'write':259,719 'written':453 'wrote':53,953 'x':560,562,577,580,583 'yaml.load':493 'yesterday':357 'yet':277,1073","prices":[{"id":"72efa206-4c3f-4d56-bff4-f37d97ed30fe","listingId":"17f920a2-e46c-450d-88d3-c8a99bf4774c","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"oribarilan","category":"97","install_from":"skills.sh"},"createdAt":"2026-05-10T19:04:20.401Z"}],"sources":[{"listingId":"17f920a2-e46c-450d-88d3-c8a99bf4774c","source":"github","sourceId":"oribarilan/97/self-review","sourceUrl":"https://github.com/oribarilan/97/tree/main/skills/self-review","isPrimary":false,"firstSeenAt":"2026-05-10T19:04:20.401Z","lastSeenAt":"2026-05-18T19:05:33.090Z"}],"details":{"listingId":"17f920a2-e46c-450d-88d3-c8a99bf4774c","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"oribarilan","slug":"self-review","github":{"repo":"oribarilan/97","stars":21,"topics":["agent-skills","ai-agents","best-practices","claude-code","claude-code-plugin","claude-code-skills","coding-agents","copilot-cli","copilot-cli-plugin","opencode","opencode-plugin","programming-principles"],"license":"other","html_url":"https://github.com/oribarilan/97","pushed_at":"2026-05-15T21:32:54Z","description":"Agent skills distilled from the hard-won lessons of world-renowned programmers, in the spirit of \"97 Things Every Programmer Should Know\"","skill_md_sha":"691ec59e68cc73742c751f1fbeb20c9ad0ea339a","skill_md_path":"skills/self-review/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/oribarilan/97/tree/main/skills/self-review"},"layout":"multi","source":"github","category":"97","frontmatter":{"name":"self-review","description":"Use when about to commit, finish a task, open a PR, summarize work for the user, or when the user asks for a review or summary — NOT just on autonomous commits, which are rare in OpenCode usage"},"skills_sh_url":"https://skills.sh/oribarilan/97/self-review"},"updatedAt":"2026-05-18T19:05:33.090Z"}}