runtime backup
This commit is contained in:
312
cron/jobs.json
312
cron/jobs.json
@@ -36,135 +36,135 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"state": {
|
"state": {
|
||||||
"nextRunAtMs": 1784786400000,
|
"nextRunAtMs": 1788415200000,
|
||||||
"lastRunAtMs": 1784700000002,
|
"lastRunAtMs": 1788328800001,
|
||||||
"lastStatus": "ok",
|
"lastStatus": "ok",
|
||||||
"lastError": null,
|
"lastError": null,
|
||||||
"runHistory": [
|
"runHistory": [
|
||||||
{
|
{
|
||||||
"runAtMs": 1783058400001,
|
"runAtMs": 1786687200001,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 10208,
|
"durationMs": 6221,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1783144800002,
|
"runAtMs": 1786773600001,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 6546,
|
"durationMs": 9316,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1783231200001,
|
"runAtMs": 1786860000001,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 6447,
|
"durationMs": 7565,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1783317600001,
|
"runAtMs": 1786946400001,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 7729,
|
"durationMs": 8013,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1783404000001,
|
"runAtMs": 1787032800001,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 11954,
|
"durationMs": 8457,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1783490400002,
|
"runAtMs": 1787119200002,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 6695,
|
"durationMs": 8879,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1783576800001,
|
"runAtMs": 1787205600002,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 7226,
|
"durationMs": 7420,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1783663200002,
|
"runAtMs": 1787292000002,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 24591,
|
"durationMs": 7307,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1783749600001,
|
"runAtMs": 1787378400001,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 6103,
|
"durationMs": 7402,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1783836000002,
|
"runAtMs": 1787464800001,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 13714,
|
"durationMs": 8817,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1783922400001,
|
"runAtMs": 1787551200002,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 4394,
|
"durationMs": 9626,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784008800001,
|
"runAtMs": 1787637600002,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 5509,
|
"durationMs": 12925,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784095200002,
|
"runAtMs": 1787724000002,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 9619,
|
"durationMs": 10899,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784181600002,
|
"runAtMs": 1787810400002,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 4033,
|
"durationMs": 5000,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784268000002,
|
"runAtMs": 1787896800002,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 6314,
|
"durationMs": 4464,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784354400012,
|
"runAtMs": 1787983200001,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 5403,
|
"durationMs": 5148,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784440800001,
|
"runAtMs": 1788069600002,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 5356,
|
"durationMs": 5748,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784527200003,
|
"runAtMs": 1788156000001,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 9145,
|
"durationMs": 95646,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784613600002,
|
"runAtMs": 1788242400002,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 6222,
|
"durationMs": 4653,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784700000002,
|
"runAtMs": 1788328800001,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 5361,
|
"durationMs": 3988,
|
||||||
"error": null
|
"error": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"createdAtMs": 1782281393634,
|
"createdAtMs": 1782281393634,
|
||||||
"updatedAtMs": 1784700005363,
|
"updatedAtMs": 1788328803989,
|
||||||
"deleteAfterRun": false
|
"deleteAfterRun": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -191,135 +191,135 @@
|
|||||||
"originMetadata": {}
|
"originMetadata": {}
|
||||||
},
|
},
|
||||||
"state": {
|
"state": {
|
||||||
"nextRunAtMs": 1784718864680,
|
"nextRunAtMs": 1788360482419,
|
||||||
"lastRunAtMs": 1784711663306,
|
"lastRunAtMs": 1788353282400,
|
||||||
"lastStatus": "ok",
|
"lastStatus": "ok",
|
||||||
"lastError": null,
|
"lastError": null,
|
||||||
"runHistory": [
|
"runHistory": [
|
||||||
{
|
{
|
||||||
"runAtMs": 1784574764878,
|
"runAtMs": 1788216481686,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1346,
|
"durationMs": 10,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784581966225,
|
"runAtMs": 1788223681698,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1325,
|
"durationMs": 10,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784589167553,
|
"runAtMs": 1788230881709,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1340,
|
"durationMs": 10,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784596368895,
|
"runAtMs": 1788238081720,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1336,
|
"durationMs": 9,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784603570233,
|
"runAtMs": 1788245281730,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1389,
|
"durationMs": 10,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784610771624,
|
"runAtMs": 1788252481740,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1322,
|
"durationMs": 10,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784617972948,
|
"runAtMs": 1788259681751,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 12914,
|
"durationMs": 11,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784625185864,
|
"runAtMs": 1788266881764,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1325,
|
"durationMs": 10,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784632387190,
|
"runAtMs": 1788274081775,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1341,
|
"durationMs": 9,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784639588532,
|
"runAtMs": 1788281281786,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1323,
|
"durationMs": 10,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784646789856,
|
"runAtMs": 1788288481797,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1376,
|
"durationMs": 11,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784653991234,
|
"runAtMs": 1788295681809,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1344,
|
"durationMs": 17,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784661192580,
|
"runAtMs": 1788302881827,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1347,
|
"durationMs": 12,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784668393929,
|
"runAtMs": 1788310081840,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1355,
|
"durationMs": 13,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784675595285,
|
"runAtMs": 1788317282062,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1378,
|
"durationMs": 12,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784682796664,
|
"runAtMs": 1788324482170,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1345,
|
"durationMs": 9,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784689998010,
|
"runAtMs": 1788331682180,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1365,
|
"durationMs": 15,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784697199383,
|
"runAtMs": 1788338882198,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1362,
|
"durationMs": 10,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784704400748,
|
"runAtMs": 1788346082210,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 62557,
|
"durationMs": 12,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784711663306,
|
"runAtMs": 1788353282400,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1374,
|
"durationMs": 19,
|
||||||
"error": null
|
"error": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"createdAtMs": 1782900509007,
|
"createdAtMs": 1788151596627,
|
||||||
"updatedAtMs": 1784711664680,
|
"updatedAtMs": 1788353282419,
|
||||||
"deleteAfterRun": false
|
"deleteAfterRun": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -346,135 +346,135 @@
|
|||||||
"originMetadata": {}
|
"originMetadata": {}
|
||||||
},
|
},
|
||||||
"state": {
|
"state": {
|
||||||
"nextRunAtMs": 1784717064686,
|
"nextRunAtMs": 1788356882542,
|
||||||
"lastRunAtMs": 1784715264686,
|
"lastRunAtMs": 1788355082541,
|
||||||
"lastStatus": "ok",
|
"lastStatus": "ok",
|
||||||
"lastError": null,
|
"lastError": null,
|
||||||
"runHistory": [
|
"runHistory": [
|
||||||
{
|
{
|
||||||
"runAtMs": 1784680996701,
|
"runAtMs": 1788320882077,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 0,
|
"durationMs": 0,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784682798010,
|
"runAtMs": 1788322682078,
|
||||||
"status": "ok",
|
|
||||||
"durationMs": 1,
|
|
||||||
"error": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"runAtMs": 1784684598011,
|
|
||||||
"status": "ok",
|
|
||||||
"durationMs": 1,
|
|
||||||
"error": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"runAtMs": 1784686398014,
|
|
||||||
"status": "ok",
|
|
||||||
"durationMs": 1,
|
|
||||||
"error": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"runAtMs": 1784688198016,
|
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 0,
|
"durationMs": 0,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784689999378,
|
"runAtMs": 1788324482179,
|
||||||
"status": "ok",
|
|
||||||
"durationMs": 0,
|
|
||||||
"error": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"runAtMs": 1784691799379,
|
|
||||||
"status": "ok",
|
|
||||||
"durationMs": 0,
|
|
||||||
"error": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"runAtMs": 1784693599380,
|
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1,
|
"durationMs": 1,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784695399383,
|
"runAtMs": 1788326282305,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 0,
|
"durationMs": 0,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784697200745,
|
"runAtMs": 1788328082308,
|
||||||
"status": "ok",
|
|
||||||
"durationMs": 1,
|
|
||||||
"error": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"runAtMs": 1784699000748,
|
|
||||||
"status": "ok",
|
|
||||||
"durationMs": 1,
|
|
||||||
"error": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"runAtMs": 1784700800751,
|
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 0,
|
"durationMs": 0,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784702600757,
|
"runAtMs": 1788329882515,
|
||||||
"status": "ok",
|
|
||||||
"durationMs": 0,
|
|
||||||
"error": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"runAtMs": 1784704463308,
|
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1,
|
"durationMs": 1,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784706263311,
|
"runAtMs": 1788331682517,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1,
|
"durationMs": 1,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784708063313,
|
"runAtMs": 1788333482519,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 0,
|
"durationMs": 0,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784709863314,
|
"runAtMs": 1788335282521,
|
||||||
|
"status": "ok",
|
||||||
|
"durationMs": 0,
|
||||||
|
"error": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"runAtMs": 1788337082522,
|
||||||
|
"status": "ok",
|
||||||
|
"durationMs": 0,
|
||||||
|
"error": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"runAtMs": 1788338882524,
|
||||||
|
"status": "ok",
|
||||||
|
"durationMs": 0,
|
||||||
|
"error": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"runAtMs": 1788340682525,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1,
|
"durationMs": 1,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784711664683,
|
"runAtMs": 1788342482527,
|
||||||
"status": "ok",
|
|
||||||
"durationMs": 0,
|
|
||||||
"error": null
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"runAtMs": 1784713464684,
|
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 1,
|
"durationMs": 1,
|
||||||
"error": null
|
"error": null
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"runAtMs": 1784715264686,
|
"runAtMs": 1788344282529,
|
||||||
|
"status": "ok",
|
||||||
|
"durationMs": 1,
|
||||||
|
"error": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"runAtMs": 1788346082530,
|
||||||
|
"status": "ok",
|
||||||
|
"durationMs": 1,
|
||||||
|
"error": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"runAtMs": 1788347882532,
|
||||||
|
"status": "ok",
|
||||||
|
"durationMs": 1,
|
||||||
|
"error": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"runAtMs": 1788349682534,
|
||||||
|
"status": "ok",
|
||||||
|
"durationMs": 1,
|
||||||
|
"error": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"runAtMs": 1788351482536,
|
||||||
|
"status": "ok",
|
||||||
|
"durationMs": 1,
|
||||||
|
"error": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"runAtMs": 1788353282539,
|
||||||
"status": "ok",
|
"status": "ok",
|
||||||
"durationMs": 0,
|
"durationMs": 0,
|
||||||
"error": null
|
"error": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"runAtMs": 1788355082541,
|
||||||
|
"status": "ok",
|
||||||
|
"durationMs": 1,
|
||||||
|
"error": null
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"createdAtMs": 1782900509009,
|
"createdAtMs": 1788151596637,
|
||||||
"updatedAtMs": 1784715264686,
|
"updatedAtMs": 1788355082542,
|
||||||
"deleteAfterRun": false
|
"deleteAfterRun": false
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,5 +1,134 @@
|
|||||||
# History
|
# History
|
||||||
|
|
||||||
|
## 2026-09-02 — reflect: noční běh padal na timeout a zahazoval hotové dávky
|
||||||
|
|
||||||
|
**Cíl:** Noční cron (`30 3 * * *`) neodběhl — ve 4:00 přišlo na Telegram
|
||||||
|
`reflect: ERROR — timeout po 30 min`. Zjistit proč a opravit.
|
||||||
|
|
||||||
|
**Co jsem zkusil / co jsem našel:**
|
||||||
|
|
||||||
|
Rozbor `log/reflect_cron.log` a `reflect/state.json` dal pět příčin, které se násobily:
|
||||||
|
|
||||||
|
1. **Cron žral celý backlog, ne denní přírůstek.** Za kurzorem (`2026-05-27T14:39`) leželo
|
||||||
|
412 session = 7 dávek po ~500 kB ≈ 90 min práce proti 30min stropu. Ostrý běh 1. 9. byl
|
||||||
|
omezený `--max-batches 1`, cron žádný strop neměl → deterministické selhání každou noc.
|
||||||
|
2. **All-or-nothing zápis.** `_write_findings`, kurzor i report se dělaly teprve po poslední
|
||||||
|
dávce. Dávky 0 a 1 přitom **vrátily platné nálezy** (03:38 a 03:55) — timeout je zahodil
|
||||||
|
a kurzor nechal na místě, takže druhý den totéž plus nové session. Ráčna, která se sama
|
||||||
|
nerozjede.
|
||||||
|
3. **Requesty na hraně timeoutu.** Prompt 185 k tokenů, `_OPENAI_COMPAT_REQUEST_TIMEOUT_S`
|
||||||
|
je 120 s a `NANOBOT_LLM_TIMEOUT_S` 300 s. 9× timeout; retry zahodí hotový prefill
|
||||||
|
a začne od nuly, dva tahy (600 s) skončily `Error calling LLM: timed out after 300s`.
|
||||||
|
4. **Infra chyba se tvářila jako vadná odpověď.** Ten error text šel do `parse_findings`
|
||||||
|
→ „the JSON is invalid" + zavádějící hint o uvozovkách → spotřeboval 1 ze 3 JSON pokusů
|
||||||
|
za dávku, a model dostal vytýkáno něco, co nenapsal.
|
||||||
|
5. **Tool cally v analytickém tahu** (`read_file SOUL.md`, `skills/*/SKILL.md`, `grep`) —
|
||||||
|
každá iterace je další plný prefill, 2–4 min na dávku.
|
||||||
|
|
||||||
|
**Co fungovalo a proč:**
|
||||||
|
|
||||||
|
- **Zápis po každé dávce** (`commit()` uvnitř smyčky v `_run`): nálezy, kurzor, report
|
||||||
|
i záznam běhu jdou na disk hned. Kurzor se navíc nikdy nepohne dozadu (`max` proti
|
||||||
|
stávající hodnotě), aby spadlý `--all` neshodil noční postup.
|
||||||
|
- **Soft deadline** `--deadline-minutes` (default 20) — nová dávka nezačne po limitu,
|
||||||
|
`TIMEOUT_SECONDS` zvednut na 45 min a je teď jen brzda na zaseknutou jednu dávku.
|
||||||
|
Když běh nedojde na konec, do Telegramu se přidá `Zpracováno N/M dávek.`
|
||||||
|
- **Infra chyba ≠ vadná odpověď:** `RunResult.stop_reason == "error"` (resp. `.error`) se
|
||||||
|
pozná dřív než validátor, nespotřebuje JSON pokus a přepošle **původní** prompt v čerstvé
|
||||||
|
session (selhaný tah nechal v té staré error zprávu i celý destilát). Strop 2 pokusy, pak
|
||||||
|
`ReflectError("model nedostupný: …")`.
|
||||||
|
- **Timeouty přes env** v hlavičce skriptu (`os.environ.setdefault`):
|
||||||
|
`NANOBOT_OPENAI_COMPAT_TIMEOUT_S=600`, `NANOBOT_LLM_TIMEOUT_S=900`.
|
||||||
|
- **Menší dávky:** `DEFAULT_BUDGET_CHARS` 500 000 → 200 000 (~70 k tokenů).
|
||||||
|
- **Strop na čtení souborů** v promptu („Read at most 2 files").
|
||||||
|
|
||||||
|
**Ověření (ostrý běh 06:51):** 26 session, jedna dávka, **147 s**, 83 k prompt tokenů,
|
||||||
|
**jedna iterace, žádný tool call, žádný provider timeout, JSON dobrý na první pokus**
|
||||||
|
(dřív ~13 min na dávku). Kurzor se posunul `2026-05-27T14:39` → `2026-05-29T09:21`,
|
||||||
|
`findings.jsonl` má 3 `open` + 4 `watch`, report `results/2026-09-02_reflect.md` sedí,
|
||||||
|
`state.json` má záznam běhu s `batches: 1`. Lokálně 115 testů zelených (11 nových), ruff čistý.
|
||||||
|
|
||||||
|
**Co zbývá:**
|
||||||
|
|
||||||
|
- Nechat proběhnout noční cron a ráno ověřit, že kurzor pokročil a nepřišel ERROR.
|
||||||
|
- Backlog (~386 session) se teď vysype po dávkách sám; kvalitu nálezů projít přes `/reflect`.
|
||||||
|
- **Pozor na falešné regrese:** analýza starých session hlásí `regression_of` u vzorů
|
||||||
|
opravených 1. 9. (`answer-self-config-from-guesswork`), protože ty session jsou z května,
|
||||||
|
tedy z doby před opravou. Regresní příznak má smysl teprve u session novějších než `applied`.
|
||||||
|
- Patche: tenhle běh nevrátil ani jeden (dřív 1 z 8). Sledovat, jestli to je náhoda, nebo
|
||||||
|
cena za strop na čtení souborů.
|
||||||
|
|
||||||
|
**Jak to vrátit zpět:** `git revert` commitu se změnou skillu v tomto repu + rsync na server
|
||||||
|
(`rsync -av --exclude '__pycache__' --exclude '.pytest_cache' skills/reflect/ nanobot@nanobot.hell:/home/nanobot/.nanobot/workspace/skills/reflect/`).
|
||||||
|
Kurzor v `reflect/state.json` na serveru se dá vrátit ručně na `2026-05-27T14:39:22.120065`,
|
||||||
|
nálezy z běhu 06:51 mají `created: 2026-09-02` (7 řádků v `findings.jsonl`).
|
||||||
|
|
||||||
|
## 2026-09-01 — reflect: review skillu a oprava tří tichých chyb + zjednodušení validátoru
|
||||||
|
|
||||||
|
**Cíl:** Uživatel chtěl důkladné review skillu `reflect` se zaměřením na to, jestli jsou skripty
|
||||||
|
zbytečně dlouhé a složité. Review našlo tři tiché chyby (nic nespadne, jen se děje něco jiného, než
|
||||||
|
co slibuje dokumentace) a čtyři místa zbytečné složitosti. Plán schválen, pak vykonán.
|
||||||
|
|
||||||
|
**Co jsem zkusil / co fungovalo a proč:**
|
||||||
|
|
||||||
|
1. **Kurzor nefiltroval.** `_run` ukládal `digest.started` zformátovaný (`2026-07-11 14:02`), ale
|
||||||
|
`collect_sessions` ho porovnávala proti syrovému `created_at` (`2026-07-11T09:00:12.345678`).
|
||||||
|
`'T'` (0x54) > `' '` (0x20) → porovnání vždycky vyšlo „novější". Ověřeno na 332 reálných session:
|
||||||
|
se starým formátem se **9 session z dne kurzoru analyzovalo znovu každý běh**, výskyty se počítaly
|
||||||
|
dvakrát a vzor se povyšoval na `open` dřív, než skutečně nastal podruhé — přesně to, čemu má práh
|
||||||
|
bránit. Fix: `SessionDigest.started` drží syrové ISO, formátuje se až v hlavičce destilátu.
|
||||||
|
Unit test to nechytal, protože si `since` podával jako literál v ISO — ve formátu, který volající
|
||||||
|
nikdy nevyrobí. Nový test dělá round-trip, který dělá `_run`.
|
||||||
|
|
||||||
|
2. **Zamítnutí vydrželo jen jeden běh.** `merge_findings` hledala `previous` jako záznam s nejnovějším
|
||||||
|
`created`. Po zamítnutí vznikl nový `watch` záznam s dnešním datem, ten příště přebil `rejected`
|
||||||
|
a vzor se otevřel. Reprodukováno: běh po zamítnutí → `watch`, o běh dál → `open`, přestože README
|
||||||
|
slibuje „zamítnutý vzor se znovu neotevře". Na serveru leží 4 zamítnuté vzory, takže by to bylo
|
||||||
|
vidět hned při backlog běhu. Fix: zamítnutí je vlastnost *vzoru* (`rejected_patterns` set přes
|
||||||
|
všechny záznamy), ne posledního záznamu. Stejná příčina brala i `regression_of` — přenáší se dál.
|
||||||
|
|
||||||
|
3. **`reflect_apply.py` hlásil „refused" po tom, co už soubor změnil.** Zápis byl před commitem, takže
|
||||||
|
selhání `git commit` vrátilo exit 2 se změněným necommitnutým souborem, bez audit řádku a s nálezem
|
||||||
|
pořád `open`. SKILL.md přitom agentovi říká „exit 2 = odmítnuto, jdi dál". Fix: rollback na původní
|
||||||
|
obsah (`check_patch` ho vrací, jen se zahazoval) + best-effort odstagování, původní chyba se
|
||||||
|
propaguje beze změny.
|
||||||
|
|
||||||
|
4. **Validátor zahazoval celou dávku.** Neznámý klíč, o 10 znaků delší diagnóza nebo 13 nálezů místo 12
|
||||||
|
vyhodily `FindingsError` a přeposlaly celý prompt — **~500 kB ≈ 420k tokenů**. Plán přitom říká
|
||||||
|
„zahodí vadné". Nově: retry jen když se nedá naparsovat JSON nebo nepřežil ani jeden nález; vadný
|
||||||
|
nález se zahodí, vadný patch se zahodí jen patch (diagnóza a návrh mají cenu i bez něj), dlouhý text
|
||||||
|
se ořízne, přebytečné nálezy se useknou. Důvody jdou na stderr, ať zahazování není neviditelné.
|
||||||
|
|
||||||
|
5. **Mrtvé a nekonzistentní věci:** `known-patterns.md` se generoval, ale nikdo ho nečetl (slovník pro
|
||||||
|
prompt se počítá přímo z `findings.jsonl`) — zrušen včetně řádků v obou dokumentacích.
|
||||||
|
`--check` existoval, ale SKILL.md místo něj instruoval agenta ověřit patch ručně — teď tiskne diff
|
||||||
|
a skill ho jen ukazuje. Dva různé výchozí budgety (1,5 M vs 500 k) sjednoceny na jednu konstantu.
|
||||||
|
`_session_start` četl celý JSONL kvůli pěti záznamům. Report dostal metriku „výskyt známých vzorů
|
||||||
|
na 100 session", kterou plán chtěl a nikdy nedostal.
|
||||||
|
|
||||||
|
**Co jsem záměrně neudělal:** přepis `Finding` dataclass na dicty (ušetřilo by ~45 řádků, ale je to
|
||||||
|
čistá kosmetika sahající na většinu prahových testů) a změnu struktury `_run` kvůli 30min timeoutu
|
||||||
|
(backlog jde bezpečně po dávkách přes `--all --max-batches 2`, jen to nebylo nikde napsané — doplněno
|
||||||
|
do README).
|
||||||
|
|
||||||
|
**Verifikace:** 105 testů zelených lokálně i na serveru (bylo 96; 9 nových pokrývá přesně ty tři chyby
|
||||||
|
a nové chování validátoru). End-to-end na 332 reálných session: 1. běh 332 session → kurzor, 2. běh
|
||||||
|
0 session; částečný běh po 2 dávkách pokračuje s nulovým překryvem. `ruff check` + `ruff format` čisté.
|
||||||
|
Dry-run na serveru: 337 session v 7 dávkách po ≤499 kB, `git status` workspace 18 souborů před i po
|
||||||
|
(nic se nezměnilo).
|
||||||
|
|
||||||
|
**Nasazení:** `rsync` na server (drift proti repu žádný — ověřeno před přepisem). Smazán mrtvý
|
||||||
|
`reflect/known-patterns.md`. **Kurzor v `reflect/state.json` přepsán** z `2026-05-27 14:39` na
|
||||||
|
`2026-05-27T14:39:22.120065`, jinak by se ten den zpracoval ještě jednou.
|
||||||
|
|
||||||
|
**Co zbývá:** `reflect/` na serveru **není v gitu** — ani trackované, ani ignorované, přestože plán
|
||||||
|
počítal s tím, že bude verzované jako auditní stopa nálezů a rozhodnutí. Rozhodnutí na uživateli.
|
||||||
|
|
||||||
|
**Jak vrátit zpět:** `git revert 46fe20f` (skill) a `git revert 69fe364` (rsync exclude v CLAUDE.md),
|
||||||
|
pak `rsync -av --exclude '__pycache__' --exclude '.pytest_cache' skills/reflect/ nanobot@nanobot.hell:/home/nanobot/.nanobot/workspace/skills/reflect/`.
|
||||||
|
Kurzor zpět: přepsat `reflect/state.json` na `2026-05-27 14:39`. `known-patterns.md` se obnoví sám
|
||||||
|
jen s revertovaným kódem.
|
||||||
|
|
||||||
## 2026-07-02 — bookmark: zestručnění frontmatter description (routing-focused), nasazeno
|
## 2026-07-02 — bookmark: zestručnění frontmatter description (routing-focused), nasazeno
|
||||||
|
|
||||||
**Cíl:** Popis skillu byl moc dlouhý, prozaický a obecný („Manage a personal reading list…"). Přepsat na krátký, foldovaný (`>`) a zaměřený na *kdy aktivovat*, ne na výčet funkcí.
|
**Cíl:** Popis skillu byl moc dlouhý, prozaický a obecný („Manage a personal reading list…"). Přepsat na krátký, foldovaný (`>`) a zaměřený na *kdy aktivovat*, ne na výčet funkcí.
|
||||||
@@ -2327,3 +2456,601 @@ Běh 5 modelů s gate=3:
|
|||||||
**Co zbývá:** Model je do dobití extra usage na ollama.com nepoužitelný. Alternativa bez dobíjení, pokud ji uživatel bude chtít: preset přes OpenRouter (`moonshotai/kimi-k3`, ctx 1 048 576, $3/M in + $15/M out) — provider `openrouter` je v configu už nakonfigurovaný. Nezakládal jsem ho, nebylo zadáno.
|
**Co zbývá:** Model je do dobití extra usage na ollama.com nepoužitelný. Alternativa bez dobíjení, pokud ji uživatel bude chtít: preset přes OpenRouter (`moonshotai/kimi-k3`, ctx 1 048 576, $3/M in + $15/M out) — provider `openrouter` je v configu už nakonfigurovaný. Nezakládal jsem ho, nebylo zadáno.
|
||||||
|
|
||||||
**Jak vrátit zpět:** `ssh nanobot@nanobot.hell 'cp ~/.nanobot/backup/config.json.bak-20260727-202245 ~/.nanobot/config.json'` — mimo tuhle jednu hodnotu jsem na serveru nic neměnil.
|
**Jak vrátit zpět:** `ssh nanobot@nanobot.hell 'cp ~/.nanobot/backup/config.json.bak-20260727-202245 ~/.nanobot/config.json'` — mimo tuhle jednu hodnotu jsem na serveru nic neměnil.
|
||||||
|
|
||||||
|
## 2026-08-01 — Upgrade nanobot 0.2.2 → 0.3.0: rozbité `uv` v `exec`, osiřelý `TOOLS.md`, mrtvý `maxMessages`
|
||||||
|
|
||||||
|
**Cíl:** Po upgradu na 0.3.0 (31. 7. 15:42, restart 16:58) přestalo v chatu fungovat `uv run` — `/remind list` padal na `uv: command not found`, exit 127. Zadání: zjistit příčinu, pak opravit všechny dopady upgradu včetně `TOOLS.md` a `agents.defaults.maxMessages`.
|
||||||
|
|
||||||
|
**Co jsem zkusil (diagnóza):**
|
||||||
|
|
||||||
|
- `ssh` průzkum: `uv` je v `/home/nanobot/.local/bin/uv`, systemd unit má vlastní `Environment=PATH` bez `~/.local/bin`.
|
||||||
|
- Stažení nainstalovaného balíčku 0.3.0 (`rsync` site-packages do `tmp/srv-0.3.0/`) a čtení `agent/tools/shell.py`.
|
||||||
|
- Klon upstreamu do `tmp/nanobot-upstream/`, `git log -S` nad `shell.py`, `context.py`, `config/schema.py` mezi `v0.2.2..v0.3.0`.
|
||||||
|
- Reprodukce exec prostředí přes `env -i HOME=… /bin/bash -c` vs `-lc` (s a bez `NANOBOT_PATH_*`).
|
||||||
|
- Analýza `sessions/*.jsonl` — kdy a jak selhání vypadala.
|
||||||
|
|
||||||
|
**Co fungovalo a proč — tři nezávislé regrese:**
|
||||||
|
|
||||||
|
1. **`uv` v `exec`.** Upstream `13c951aa` (25. 6., *„change exec login-shell default from true to false"*) přepnul default `login` z `True` na `False` — profil sourcovaný login shellem vracel do exec prostředí secrets, které `_build_env()` schválně vyhazuje. Jenže `_build_env()` na Unixu **PATH vůbec nepředává** (jen `HOME`/`LANG`/`TERM`/`PYTHONUNBUFFERED`), takže bez `bash -l` se PATH dopočítá z vestavěného defaultu bashe `/usr/local/bin:…:/bin:/sbin:.`, kde `~/.local/bin` není. Odhalilo to **existující chybu v našem configu**: `tools.exec.pathAppend` obsahoval `/home/nanobot/.local/bin/uv` — cestu k **binárce**, ne k adresáři, takže do PATH lookupu nepřispíval ničím. Do 0.2.2 to maskoval login shell.
|
||||||
|
- Naměřeno: `bash -c` + starý `pathAppend` → `uv` NENALEZEN; `bash -lc` + tentýž `pathAppend` → nalezen; `bash -c` + adresář → nalezen.
|
||||||
|
- Rozsah: `remind`, `note`, `llm-wiki`, `python`. Nezasažené: crontab (vlastní `PATH=`), `bookmark` (absolutní cesta v SKILL.md), `detach` (systemd unit s PATH).
|
||||||
|
- **„Zlobí jen u některých modelů" byl klam.** Selhává každé bare `uv run`; liší se jen schopnost modelu se vzpamatovat. Model, který zkusil `PATH="$HOME/.local/bin:$PATH" uv run …`, uspěl; modely, které zkusily `which uv || find /home -name uv`, narazily na `restrictToWorkspace: true` (`Command blocked by safety guard`) a vzdaly to.
|
||||||
|
2. **`TOOLS.md` osiřel.** Upstream `d29fcaf5` (21. 5., *„internalize tool contract prompt"*) přesunul `templates/TOOLS.md` → `templates/agent/tool_contract.md` a rendruje ho přímo do promptu; `BOOTSTRAP_FILES` je nově `["AGENTS.md", "SOUL.md", "USER.md"]`. Obsah tedy nezmizel — naopak je bohatší — ale přestal být uživatelsky editovatelný. Náš workspace soubor s vlastními dopisky zůstal ležet a nikdo ho nečetl.
|
||||||
|
3. **`maxMessages` mrtvý.** Upstream `dacc6992` (29. 6.) klíč vyřadil ze schématu a přidal do `_migrate_config()` shim, který ho zahodí a zaloguje warning. Spamoval journal — **145 výskytů za hodinu**.
|
||||||
|
|
||||||
|
**Proč u `TOOLS.md` neproběhla migrace, a u `maxMessages` ano:** nanobot migruje **config**, ne **workspace**. `sync_workspace_templates()` má v docstringu doslova *„Creates missing files without overwriting user files"* — jen dotváří chybějící, nikdy nepřepisuje ani nemaže, protože workspace `*.md` jsou user data. Když šablona zmizí z balíčku, kopie ve workspace prostě zůstane, tiše. Config naopak shim + warning dostane (a `281b4b7f` ukazuje, že se ty shimy po verzi systematicky mažou).
|
||||||
|
|
||||||
|
**Co jsem změnil:**
|
||||||
|
|
||||||
|
- `~/.nanobot/config.json`: `tools.exec.pathAppend` → **`pathPrepend`** = `/home/nanobot/.local/bin:/home/nanobot/.nvm/versions/node/v24.16.0/bin` (adresář místo binárky); odstraněn `agents.defaults.maxMessages`. Zálohy `backup/config.json.bak-20260801-0703{54,}` a `-070420`. *(Obě změny nakonec zapsal uživatel sám v 07:03:54, můj skript je zastihl už hotové — ověřil jsem výsledek.)*
|
||||||
|
- `~/.config/systemd/user/nanobot.service`: `ExecStart` zpět na `/home/nanobot/.local/bin/nanobot gateway`, `Environment=` řádky odkomentované, `PATH` opraven na adresář. Wrapper `~/bin/nanobot.sh` smazán. *(Taky provedl uživatel.)* Wrapper měl tutéž chybu (`$HOME/.local/bin/uv`) a i kdyby byl správný, na `exec` by nedosáhl — ale `Environment=PATH=` v unitu **zůstává**, protože `run_cli_app` spouští CLI appky s `env=os.environ.copy()` (`apps/cli/service.py:1372`).
|
||||||
|
- `workspace/AGENTS.md`: přeneseny dvě unikátní sekce z `TOOLS.md` — `python — use uv` a `Doručené připomínky` (při přenosu opraveno `remind_edit.py` → `remind_cli.py` po přejmenování z 2026-06-10). Sekce `exec`/`grep`/`cron` zahozeny jako duplicita `tool_contract.md`.
|
||||||
|
- `workspace/TOOLS.md` smazán na serveru i v repu (šablona ho neobnoví — v `nanobot/templates/` už není).
|
||||||
|
- Restart přes `~/bin/restart.sh` v 07:05:20.
|
||||||
|
|
||||||
|
**Ověření (vše zelené):**
|
||||||
|
|
||||||
|
- Reprodukce exec prostředí: `uv → /home/nanobot/.local/bin/uv`, `node`/`npm` z nvm.
|
||||||
|
- Reálný běh `uv run skills/remind/scripts/remind_cli.py list` v simulovaném prostředí → exit 0, výpis reminderů.
|
||||||
|
- **Ostrý test přes agenta** v izolované session `cli:uv-verify-20260801` (`nanobot agent -m …`): agent zavolal bare `uv run skills/remind/scripts/remind_cli.py list`, **jedno volání, exit OK, 1664 B**, žádný fallback na absolutní cestu, žádných 127.
|
||||||
|
- `maxMessages` warning: **0 výskytů** od restartu (před restartem 145/h). Journal jinak bez chyb.
|
||||||
|
- MD5 `AGENTS.md` shodné server ↔ repo, vlastník `nanobot:nanobot`, config práva `600`.
|
||||||
|
- Doručování reminderů nedotčené (crontab má vlastní PATH): `reminder_cron.log` má mtime **2026-07-15**, tj. sender od té doby neprodukoval výstup ~23 000 běhů.
|
||||||
|
|
||||||
|
**Vedlejší nález (neopraveno, mimo zadání):** v `reminder_cron.log` je z 2026-07-15 traceback `sqlite3.OperationalError: cannot rollback - no transaction is active` na `remind_send.py:182` — `conn.execute("ROLLBACK")` na neaktivní transakci **maskuje původní chybu** (tam šlo o výpadek DNS při doručování). Latentní, od 07-15 se neopakoval. Kandidát na `todo.md`.
|
||||||
|
|
||||||
|
**Co zbývá:** Zvážit návrh do `decisions.md` (čeká na formulaci autora): (1) PATH pro `exec` se konfiguruje výhradně přes `tools.exec.pathPrepend`, ne přes systemd unit ani `allowedEnvKeys`; (2) systemd unit spouští binárku přímo, bez shell wrapperu. Testovací session `sessions/Y2xpOnV2LXZlcmlmeS0yMDI2MDgwMQ.jsonl` ponechána jako doklad. Repo kopie `workspace/original/` (referenční upstream šablony) nesahané — pořád obsahují starý `TOOLS.md`.
|
||||||
|
|
||||||
|
**Jak vrátit zpět:** `cp ~/.nanobot/backup/config.json.bak-20260801-070420 ~/.nanobot/config.json` + `systemctl --user restart nanobot`; `git checkout fc45e19 -- workspace/` + `rsync -av workspace/AGENTS.md workspace/TOOLS.md nanobot@nanobot.hell:/home/nanobot/.nanobot/workspace/`. Unit se dá vrátit z tvaru zaznamenaného výše. Nic se nemazalo nenávratně — `TOOLS.md` je ve verzované historii repa (commit `fc45e19`).
|
||||||
|
|
||||||
|
## 2026-09-01 06:45 — Skill `reflect`: sebe-diagnostika ze `sessions/` se schvalovací smyčkou
|
||||||
|
|
||||||
|
**Cíl:** Zrealizovat plán `plans/reflect-skill.md` — vytěžit 534 nikdy nečtených session logů (16 MB) na opakující se chyby agenta, nálezy předkládat uživateli po jednom ke schválení a aplikovat jen schválené. Klíčový požadavek uživatele: diagnózu musí dělat LLM běžící na nanobotu (jinak to nemá smysl), nic se nesmí aplikovat automaticky, Telegram jen notifikuje.
|
||||||
|
|
||||||
|
**Co jsem zkusil / co fungovalo a proč:**
|
||||||
|
|
||||||
|
*Změřená východiska.* Z 534 session je 332 reálných konverzací (12 311 zpráv). **89 % objemu (12,5 z 14,1 MB) tvoří návratové hodnoty toolů** — pro diagnózu bezcenné, stačí `name(args) → ok|ERROR, velikost`. Přírůstek 4,4 session/den, aktivita jen 70 % dní. Preset `glm53` má reálně 976k okno (`contextWindowTokens` presetu přebíjí `defaults` 65536, `agent/loop.py:476`), input budget ~958k tokenů.
|
||||||
|
|
||||||
|
*Architektura — tři skripty, tvrdě oddělené role.* `reflect_distill.py` dělá **jen mechanickou destilaci** (filtr šumu podle prefixů, ořez tool výsledků); žádné detektory, protože chyby má hledat LLM. `reflect_auto.py` je cron runner podle vzoru `compact_memory_auto.py` (fresh `session_key`, Telegram přímo přes Bot API, zpráva se skládá ve skriptu) a **nemá v sobě žádnou cestu k zápisu do cizího souboru**. `reflect_apply.py` je jediné místo, kudy vede editace.
|
||||||
|
|
||||||
|
*Aplikační brána přesunuta z promptu do kódu.* Původně měl patch aplikovat agent podle postupu v `SKILL.md`. Přepsal jsem to na skript — recept z `develop/history.md` říká, že měkká instrukce nestačí, musí to být tvrdá brána. `reflect_apply.py` odmítne patch, jehož `old_text` v souboru není nebo je tam vícekrát, odmítne nález, který není `open`, commituje výhradně `git add -- <file>` a rozdělaný cílový soubor nejdřív checkpointne. 96 testů, včetně reálného `git revert`.
|
||||||
|
|
||||||
|
*Práh notifikace.* Denní dávka (medián 4 session) je moc malá na vzor. Nález poprvé → `watch`, mlčí; při opakování (≥2× a ≥2 session) → `open` + Telegram; zamítnutý vzor se **už nikdy neotevře** (zamítnutí je rozhodnutí, ne odklad); vzor po `applied` → `open` s příznakem regrese.
|
||||||
|
|
||||||
|
*Guard proti zápisu při analýze.* Před a po agentním tahu se porovná `git status --porcelain` + HEAD celého workspace. Kdyby agent při analýze cokoli zapsal, nálezy se zahodí.
|
||||||
|
|
||||||
|
**Ověřeno ostrým během (15 session, 90 kB destilátu):** model našel 8 vzorů, všechny konkrétní a doložené citacemi session — mj. `answer-self-config-from-guesswork` (vymyšlené schéma `tools.my.allow_set` zapsané do živého configu), `tool-call-leaked-as-text` (surový tool call se speciálními tokeny jako poslední zpráva session), `retry-without-diagnosis` (18× ve 4 session, vč. rozbité dvojité URL `r.jina.ai/http://r.jina.ai/http://…`). Dva běhy po sobě → **8 nálezů bez jediné duplicity**, dedup přes `pattern` funguje. `--check` na reálném patchi do `SOUL.md` prošel a soubor nezměnil. Sebe-vyloučení ověřeno na reálné `reflect:*` session.
|
||||||
|
|
||||||
|
**Dvě chyby, které běh odhalil, a jejich fix:**
|
||||||
|
|
||||||
|
1. `uv` **není v `PATH` neinteraktivního SSH** — první běh spadl na `timeout: failed to run command 'uv'`. Fix: plná cesta `/home/nanobot/.local/bin/uv`. Crontab má vlastní `PATH`, tam stačí `uv`.
|
||||||
|
2. **Model rozbil JSON českou uvozovkou** — napsal `(„repeated external lookup blocked")`, kde zavírací uvozovka je ASCII `"`, což předčasně ukončí JSON string. Hláška „no parseable json block" navíc retry nedala nic použitelného. Fix: validátor hlásí řádek, sloupec a výřez okolo chyby + prompt zakazuje uvozovky uvnitř string hodnot. Po opravě prošel **první pokus**.
|
||||||
|
3. Odhad tokenizace byl mimo: naměřeno **1,2 znaku na token** (ne 3), takže dávka 800 kB by dala ~670k tokenů. Sníženo na 500 kB.
|
||||||
|
|
||||||
|
**Nasazeno:** `skills/reflect/` na server (`nanobot:nanobot`), crontab `30 3 * * *`. Stav žije v `workspace/reflect/` (mimo adresář skillu, aby ho `rsync` nepřepsal) a je verzovaný v git workspace.
|
||||||
|
|
||||||
|
**Co zbývá:**
|
||||||
|
|
||||||
|
- **Uživatel projde prvních 8 nálezů přes `/reflect`** — to je zpětná vazba na kvalitu. Backlog (zbývá ~405 session, cursor stojí na `2026-05-27 14:39`) jsem **záměrně nepouštěl celý**: nemá smysl generovat desítky nálezů, dokud se neověří, že jsou k něčemu.
|
||||||
|
- Workspace na serveru má 11 nezacommitovaných změn (`cron/jobs.json`, `memory/*`, …) — před ostrým používáním uklidit, jinak bude diff po patchi zašuměný.
|
||||||
|
- Po každé review dotáhnout změněné soubory ze serveru do repa (obě git repa jsou bez remote, nespojená).
|
||||||
|
- Návrh do `decisions.md` (čeká na formulaci autora): (1) sebemodifikace jen přes `reflect_apply.py` po explicitním schválení jednoho nálezu, nikdy agentem přímo; (2) skript destiluje, quality judgements dělá výhradně LLM.
|
||||||
|
|
||||||
|
**Jak vrátit zpět:** `crontab -e` a smazat dva řádky `reflect`; `rm -rf ~/.nanobot/workspace/skills/reflect ~/.nanobot/workspace/reflect ~/.nanobot/workspace/results/2026-09-01_reflect.md`; lokálně `git revert` commitů `4aff500`, `1a8bc2a`, `7780841`, `ecc7d03`, `1bb5f4d`. Nic destruktivního neproběhlo — skill zatím jen četl a zapisoval do vlastního sandboxu.
|
||||||
|
|
||||||
|
## 2026-09-02 06:05 — skill `plan`: odstranění češtiny ze `SKILL.md`
|
||||||
|
|
||||||
|
**Cíl:** V `skills/plan/SKILL.md` nesmí zůstat jediné české slovo — konvence projektu je, že skilly pro nanobota jsou EN-only.
|
||||||
|
|
||||||
|
**Co jsem zkusil:** Nejdřív diff serverové verze proti lokální (`ssh cat` + `diff`) — byly **identické**, takže se nic ze serveru nezahazovalo. Pak dvě chirurgické editace: (1) nadpisy v šabloně plánu `## Kontext / ## Postup / ## Ověření` → `## Context / ## Steps / ## Verification`; (2) český literál schvalovací otázky (`Plán uložen do … Schvaluješ? Mám ho vykonat teď?`) nahrazen anglickou **instrukcí** místo doslovného textu — lokalizaci už pokrývá stávající pravidlo *"Respond in the user's language"*.
|
||||||
|
|
||||||
|
**Co fungovalo a proč:** `grep -nP '[ěščřžýáíéúůťďň…]|Kontext|Postup|Schvaluj|teď'` vrací prázdno. Nasazeno `rsync`em do `~/.nanobot/workspace/skills/plan/`, vlastník `nanobot:nanobot`, po nasazení server ↔ lokál `IDENTICAL`. Restart služby nebyl potřeba — skilly se čtou při každém tahu.
|
||||||
|
|
||||||
|
**Důsledek:** Nanobot bude nově psát plány do `workspace/plans/` s anglickými nadpisy i pro česky mluvícího uživatele. Tělo plánu si model dál lokalizuje, mění se jen struktura.
|
||||||
|
|
||||||
|
**Jak vrátit zpět:** `git revert` commitu se změnou skillu + znovu `rsync` na server.
|
||||||
|
|
||||||
|
## 2026-09-02 06:10 — skill `project`: deterministický zápis do `memory.md`, přepis skillu, oprava dat
|
||||||
|
|
||||||
|
**Cíl:** Review skillu `/project` proti reálným datům, která pod ním na serveru vznikla (`projects/{chata,life,proxmox,radio1}`), a oprava toho, co v praxi nedrží.
|
||||||
|
|
||||||
|
**Co review našlo (doloženo v datech, ne odvozeno z textu skillu):**
|
||||||
|
|
||||||
|
1. **Vymyšlená data** — `chata/memory.md` měl dva záznamy datované `2026-09-14`, přitom byly zapsány 2026-09-01 (mtime 10:51). Skill předepisoval formát `- YYYY-MM-DD:`, ale neříkal, odkud datum vzít — a model má přitom `Current Time` v runtime kontextu.
|
||||||
|
2. **Slepený řádek** — `proxmox/memory.md` obsahoval `…jako další VM/kontejner.- 2026-09-01: Rozhodnuto —` na jednom řádku. `chata/memory.md` neměl koncový newline.
|
||||||
|
3. **`state.md` se nikdy nezaložil** — `chata` 0 B při 2 KB memory. Pravidlo *„offer to draft it"* je příliš měkké a nespustí se.
|
||||||
|
4. **Mrtvé pravidlo o Dreamu** — *„Dream must not touch `workspace/projects/`"* žilo v těle skillu, které Dream nikdy nečte, a upstream to už vynucuje kódem: `build_dream_tools()` (`nanobot/agent/memory.py:641`) dává Dreamu Write/Edit/ApplyPatch s `allowed_dir = workspace/skills` + tři memory soubory. Do `projects/` se nedostane. **Nekryté je riziko opačné** — Dream smí přepisovat samotný skill, a serverový `SKILL.md` byl 2026-09-01 13:15 skutečně změněn mimo repo.
|
||||||
|
|
||||||
|
**Co jsem zkusil a co fungovalo:**
|
||||||
|
|
||||||
|
- **Nejdřív dotažen server → repo** (commit `3c388ba`), aby byl přepis čitelný v diffu.
|
||||||
|
- **`skills/project/scripts/project_cli.py`** (`activate` / `log` / `list` / `new`) přebírá datum ze systémových hodin a newline hygienu. Text jde na **stdin quoted heredocem** (`<<'NOTE'`) — shell obsah neinterpretuje, takže `„"`, `'` i `"` projdou doslova. Ověřeno reálným zápisem.
|
||||||
|
- **16 pytest testů** lokálně zelených; na serveru se testy nespouští (konvence).
|
||||||
|
- **Data opravena** po odsouhlasení uživatelem: data `09-14` → `09-01`, rozdělen slepený řádek, doplněn newline, `chata/state.md` sepsán z historie (dřevo + otevřená otázka zazimování). Záznam o zazimování zůstal i v `memory.md` — append-only invariant se neporušil.
|
||||||
|
|
||||||
|
**Rozpočet velikosti — návrh, který padl:** Původně jsem navrhoval prahy 8 000 / 12 000 znaků odvozené z okna 65 536 tokenů. **Bylo to postavené na špatném čísle:** `agents.defaults.contextWindowTokens: 65536` preset přebíjí a default `glm53` má 976 000. `proxmox` (11 278 znaků ≈ 9 400 tokenů při 1,2 znaku/token) tedy zabírá ~1 % okna. Uživatel návrh zamítl s tím, že projekt nemá ztrácet zadaná data — správně. Zůstalo jediné reálné omezení `maxToolResultChars: 16000`, které je ale **omezením čtení, ne ukládání**: `activate` nad ním vypustí z *výstupu* nejstarší záznamy a ukáže cestu k plnému logu; soubor na disku se nemění (ověřeno na 33 790znakovém souboru — výstup 14 305 znaků, velikost souboru beze změny).
|
||||||
|
|
||||||
|
**Chyba v mém vlastním review:** tvrdil jsem, že `chata/memory.md` má „4 záznamy na 3 řádcích". `wc -l` počítá newliny, ne řádky — soubor měl 4 řádky a jen mu chyběl koncový newline. Slepený řádek byl reálně jen v `proxmox`.
|
||||||
|
|
||||||
|
**Co zbývá:**
|
||||||
|
|
||||||
|
- Reálný smoke test přes Telegram/WebUI (aktivace projektu, zápis poznámky s dnešním datem, „vypiš projekty", dotaz na detail z `chata`).
|
||||||
|
- Návrh do `decisions.md` (čeká na formulaci autora): (1) zápis do `memory.md` výhradně přes `project_cli.py log`; (2) projektová data nemají strop ani konsolidaci — velikost se řeší jen na straně čtení; (3) `artifacts/` vzniká líně při prvním artefaktu.
|
||||||
|
- `radio1` (prázdné `memory.md`/`state.md` od 23. 7.) — uživatel rozhodl nechat být.
|
||||||
|
|
||||||
|
**Jak vrátit zpět:** Zálohy dat jsou na serveru v `workspace/backup/projects-2026-09-02/` (`chata-memory.md`, `chata-state.md`, `proxmox-memory.md`) — `cp` zpět na místo. Skill: `git revert 39b3fb3 3c388ba` + `rsync` na server. Restart služby netřeba, skilly se čtou při každém tahu.
|
||||||
|
|
||||||
|
## 2026-09-02 09:05 — reflect: klouzavé okno, audit počtů a záznam rozhodnutí
|
||||||
|
|
||||||
|
**Cíl.** Uživatel se zeptal, jestli jsou nálezy z dávkované analýzy věrohodné a jak by se
|
||||||
|
změnily nad celou historií. Kontrola provozu odhalila tři nezávislé problémy plus jeden,
|
||||||
|
na který se doptal později (záznam rozhodnutí).
|
||||||
|
|
||||||
|
**Co jsem zjistil (data z běhů 1.–2. 9.).**
|
||||||
|
|
||||||
|
- `cursor: 2026-05-29`, session sahají do `2026-09-02` → 3 běhy × 1 dávka = **56 z 356
|
||||||
|
session (16 %)**, a všechny z nejstarších 4 dnů korpusu. Backlog 19 dávek při ~1 dávce/noc
|
||||||
|
neklesal. Všech 8 rozhodnutých nálezů tedy popisovalo chování z konce května.
|
||||||
|
- Dávkování samo nálezy nezkreslilo — každý běh byl **jedna** dávka. Zkreslilo je okno.
|
||||||
|
- `f09a7`: `occurrences: 4`, `sessions_affected: 5` — aritmeticky nemožné. Počty jsou
|
||||||
|
nekontrolované self-reporty modelu a `merge_findings` je jen sčítá.
|
||||||
|
- `ff77b`: tvrdí 18× a nese 2 důkazy — fold přepisoval `evidence`, ale `occurrences` sčítal.
|
||||||
|
- Audit zaznamenával **výsledek, ne rozhodnutí**: u zamítnutí chybí důvod (4 z 8 zamítnuto),
|
||||||
|
`uprav:` přepsalo `patch.new_text` a zahodilo návrh modelu, `přeskoč` nezanechalo nic.
|
||||||
|
|
||||||
|
**Co jsem zkusil a co funguje.**
|
||||||
|
|
||||||
|
1. **Klouzavé okno** (`--window-days`, default 21): `since = max(cursor, now - okno)`.
|
||||||
|
Cursor je podlaha (nic dvakrát), okno strop (starý backlog se přeskočí natrvalo).
|
||||||
|
Backlog se nedohání — rozhodnutí uživatele, archeologie z května hodnotu nemá.
|
||||||
|
2. **Ostrý `--all` odmítnut** — znovu čte spočítané session a `merge_findings` jim sečte
|
||||||
|
`occurrences` do existujícího záznamu. Je to nafukovač počtů; zůstává pro `--dry-run`.
|
||||||
|
3. **Clamp počtů** ve validátoru: `sessions_affected ≤ min(occurrences, session_count)`.
|
||||||
|
Clamp, ne odmítnutí — retry stojí celý tah.
|
||||||
|
4. **`_fold_evidence()`** — při foldu se důkazy kumulují (nejnovější první, dedup, cap 6),
|
||||||
|
takže kumulativní počet jde ověřit. U regrese se nekumulují (mísily by před/po opravou).
|
||||||
|
5. **Prompt**: model dostal informaci, že vidí jen výsek, a smí hlásit i jediný výskyt
|
||||||
|
**známého** vzoru. Tím se zavřela slepá skvrna — vzor s frekvencí ~1×/dávka se dřív
|
||||||
|
nikdy nepojmenoval (prompt to zakazoval) → nikdy nespočítal → práh nepřelezl.
|
||||||
|
6. **Záznam rozhodnutí** v `reflect_apply.py`: `--reject` vyžaduje `--reason` (povinně —
|
||||||
|
je to jediná zpětná vazba na kvalitu analýzy), nová akce `--skip` s počítadlem,
|
||||||
|
`patch` zůstává návrhem modelu a uživatelova verze jde do `applied.new_text`
|
||||||
|
(`APPLIED-EDITED` v logu). `SKILL.md` má sekci *Decision history*.
|
||||||
|
7. **Report a Telegram** nesou okno a nemlčí o nezpracovaném zbytku — dřív se při 0 nálezech
|
||||||
|
vracel prázdný string, což je přesně důvod, proč hladovění cursoru tři noci nikdo neviděl.
|
||||||
|
|
||||||
|
Testy: 140 prošlo (`tests/`), ruff clean. Nasazeno rsyncem, vlastník `nanobot:nanobot`.
|
||||||
|
|
||||||
|
**Ostrý běh 09:08–09:31 — ověřeno na živých datech.**
|
||||||
|
|
||||||
|
```text
|
||||||
|
Zpracováno 74 session ve 6 dávkách. Nálezů: 29 (23 k review, 6 sledovaných).
|
||||||
|
Okno: od 2026-08-12, dávek 6/6.
|
||||||
|
Známé vzory: 100,0 výskytu / 100 session (minule 57,7).
|
||||||
|
```
|
||||||
|
|
||||||
|
- Okno v hlavičce reportu i ve `state.json` (`window_from`, `batches_total`), cursor
|
||||||
|
přeskočil z `2026-05-29` na `2026-09-02T06:22` — backlog je minutý, jak bylo rozhodnuto.
|
||||||
|
- **Kumulace důkazů funguje**: `f2b3d retry-without-diagnosis` má 67 výskytů a nese 6 důkazů
|
||||||
|
(cap `MAX_EVIDENCE`) posbíraných napříč dávkami; `f999d` z 2. dávky se do něj složil.
|
||||||
|
- **Žádný nový nález není nekoherentní** (`sessions_affected ≤ occurrences` všude).
|
||||||
|
Jediný nekoherentní záznam ve store je starý `f09a7` (4×/5 session) — clamp platí na
|
||||||
|
nově parsované nálezy, historii zpětně nepřepisuje.
|
||||||
|
- Guardy `reflect_apply.py` odmítly `--reject` bez `--reason`, `--reason` bez `--reject`
|
||||||
|
i `--skip --reject`, aniž by na store sáhly.
|
||||||
|
|
||||||
|
**Korekce mé vlastní obavy z dimenzování.** Z dry-runu jsem usoudil, že 6 dávek se do
|
||||||
|
20min deadline nevejde. Neplatí: dávka trvá **~4 min**, celé okno 23 min, a deadline pustil
|
||||||
|
i šestou. Je to ale těsné (kontrola deadlinu padla na ~20 min u indexu 5), takže jedna
|
||||||
|
pomalejší dávka běh zastaví a zbytek nechá na další noc — což Telegram ohlásí. Zvýšení
|
||||||
|
`DEFAULT_DEADLINE_MINUTES` na ~40 min je proto drobná pojistka, ne nutnost.
|
||||||
|
|
||||||
|
**Co zbývá.** 23 open nálezů k review a **ani jeden nemá patch** — potvrzuje otevřenou
|
||||||
|
položku o stropu „read at most 2 files". Regrese na session starších než oprava z 1. 9.
|
||||||
|
se pořád hlásí falešně (okno začíná 12. 8., patche jsou z 1. 9.).
|
||||||
|
|
||||||
|
**Jak to vrátit zpět.** Skripty: `git revert` v tomto repu + rsync. Stav na serveru:
|
||||||
|
`/tmp/state.json.bak` a `/tmp/findings.jsonl.bak` (záloha před ostrým během).
|
||||||
|
|
||||||
|
## 2026-09-02 10:05 — reflect: celý skill do angličtiny
|
||||||
|
|
||||||
|
**Cíl.** `SKILL.md` a Python skripty skillu `reflect` mají být EN-only (konvence
|
||||||
|
z `CLAUDE.md`), včetně textů, které skript generuje.
|
||||||
|
|
||||||
|
**Co jsem zkusil.**
|
||||||
|
|
||||||
|
- `SKILL.md`: ukázkový výstup nálezu, tabulka rozhodnutí a odkazy na ně v textu byly česky.
|
||||||
|
Klíčová slova v tabulce jsou teď `ok` / `apply`, `edit:`, `skip`, `reject`, `stop`
|
||||||
|
+ věta, že se přijímají ekvivalenty v jazyce, kterým uživatel píše. Pod ukázkou přibyla
|
||||||
|
věta, že popisky se píšou v jazyce uživatele.
|
||||||
|
- `reflect_auto.py`: report (`Zpracováno…`, `Okno:`, `Známé vzory:`, `**Výskyt/Důkazy/Návrh**`,
|
||||||
|
`REGRESE`, `poprvé/naposledy`, `Nic k hlášení`), Telegram hlášky (`nálezů k review`,
|
||||||
|
`Napiš /reflect`, timeout) a `ReflectError("model nedostupný")` → anglicky.
|
||||||
|
- `reflect_distill.py`: hlavička destilátu (`N zpráv`) a řádek statistik do stderr.
|
||||||
|
- Testy: asserty na tyto texty + česká fixture data. Ponechán jen znak `„` v testu
|
||||||
|
neescapovaných uvozovek — to je předmět testu, ne jazyk.
|
||||||
|
- Vedlejší úklid: `_decimal()` existovala jen kvůli desetinné čárce; v anglickém reportu
|
||||||
|
by `3,2 occurrences` četlo špatně, takže tečka a helper inlinovaný do `_rate_line`.
|
||||||
|
|
||||||
|
**Co fungovalo a proč.** `pytest tests -q` → **140 passed**. Před nasazením ověřeno, že
|
||||||
|
server == HEAD u `SKILL.md`, `README.md` i všech tří skriptů (nikdo do nich mimo nás
|
||||||
|
nesáhl), pak `rsync` celého adresáře, vlastník `nanobot:nanobot` sedí. Workspace na serveru
|
||||||
|
jsem necommitoval — je trvale dirty, jak je tam zvykem.
|
||||||
|
|
||||||
|
**Co zbývá.** `README.md` zůstává česky — je to dokumentace psaná uživateli, mimo dohodnutý
|
||||||
|
rozsah („SKILL.md a python skripty"). Nejbližší noční běh pošle Telegram i report anglicky.
|
||||||
|
|
||||||
|
**Jak to vrátit zpět.** `git revert 2375d76` + rsync skillu na server.
|
||||||
|
|
||||||
|
## 2026-09-02 10:15 — reflect: druhé kolo oprav (set-patch, dedup, hradlo na regrese)
|
||||||
|
|
||||||
|
**Cíl.** Vykonat [plans/reflect-verohodnost.md](plans/reflect-verohodnost.md): složení
|
||||||
|
patche při review má být jedno validované volání skriptu, počty v reportu mají odpovídat
|
||||||
|
store, a příznak regrese má znamenat „vrátilo se to **po** opravě".
|
||||||
|
|
||||||
|
**Co jsem zkusil.**
|
||||||
|
|
||||||
|
- `reflect_apply.py`: nová akce `--set-patch <json>` (`{file, old_text, new_text}`).
|
||||||
|
Pořadí je celý smysl: kandidát `{**record, "patch": novy}` projde existující
|
||||||
|
`check_patch()` (status `open`, cesta uvnitř workspace, právě jeden výskyt `old_text`,
|
||||||
|
„nemění nic") a **teprve pak** se zapíše `patch` + `patch_drafted_at` a `DRAFTED` do
|
||||||
|
auditu. Vypíše rovnou i diff, takže nenásleduje druhé volání `--check`. Vytažen helper
|
||||||
|
`_diff()` (sdílí ho `--check`) a `_parse_patch_file()`. Přepis existujícího patche
|
||||||
|
povolen — guard je status `open`, ne absence patche.
|
||||||
|
- `reflect_auto.py` bod 2: `merged` je `dict[str, Finding]` klíčovaný `pattern` místo
|
||||||
|
seznamu, do kterého se po každé dávce přičítalo. Vzor nalezený v 5 dávkách byl v reportu
|
||||||
|
5× (report z 2. 9.: **29 nadpisů proti 13 vzorům ve store**) a stejně nafouknutý šel do
|
||||||
|
`stats` i do Telegramu.
|
||||||
|
- `reflect_auto.py` bod 3: nové derivované pole `Finding.last_seen` = `max(evidence[].when)`
|
||||||
|
přes tvary `^\d{4}-\d{2}-\d{2}` (prvních 10 znaků, nedatumové hodnoty zahozené), fallback
|
||||||
|
`created`. Dvě použití: `regression_of` se nastaví jen když `last_seen > applied.at[:10]`,
|
||||||
|
jinak `stale_after_fix` → status `watch` (ne `open`, ne REGRESE); a `_seen_line()` hlásí
|
||||||
|
`last_seen` místo `created`, takže „naposledy" přestalo být datum přepsání záznamu.
|
||||||
|
Report navíc značí `— STALE` nález, jehož `last_seen` je před `window_from` běhu.
|
||||||
|
- `SKILL.md`: do STOP gate 4 doplněn **zákaz ruční editace `reflect/findings.jsonl`**
|
||||||
|
(chybějící věta, kvůli které agent legálně sáhl do store), postup `--set-patch` místo
|
||||||
|
„propose the exact old_text/new_text yourself", řazení v *1. Load* na severity →
|
||||||
|
`last_seen` → `occurrences` (s fallbackem na `created` u starých záznamů) a značení
|
||||||
|
zastaralých nálezů. `README.md`: `DRAFTED` v tabulce rozhodnutí, co znamená „zastaralý",
|
||||||
|
regrese jen po opravě, záruka o zápisu do store.
|
||||||
|
- Testy: +26 (celkem **166 passed**, ruff čistý). Klíčové: neaplikovatelný i nejednoznačný
|
||||||
|
`--set-patch` nechá záznam **bez patche** (ověření běží před zápisem), úspěšný nezmění
|
||||||
|
cílový soubor, přepis vadného draftu (scénář `fb33c`), vzájemné vyloučení s
|
||||||
|
`--check`/`--skip`/`--reject`; dedup na úrovni běhu (dvě dávky, jeden nadpis, `open` = 1);
|
||||||
|
hradlo na regresi z obou stran; `last_seen` přes míchané tvary a fallback; STALE v reportu.
|
||||||
|
|
||||||
|
**Co fungovalo a proč.** Před nasazením ověřeno, že server == HEAD u všech 8 souborů
|
||||||
|
skillu (Dream do nich nesáhl), pak `rsync` celého adresáře. Na serveru:
|
||||||
|
`pytest tests/ -q` → **166 passed**, a ostrá zkouška hradla podle plánu — `--set-patch`
|
||||||
|
s neexistujícím `old_text` na živém nálezu `f2dd0` skončil `exit=2`
|
||||||
|
(`the original text is no longer in SOUL.md`) a záznam zůstal `patch: None`,
|
||||||
|
`patch_drafted_at: None`, status `open`. Store se neušpinil neúspěšným pokusem.
|
||||||
|
|
||||||
|
Uzavírá položku o falešných regresích z [todo.md](todo.md) — chybějící datum session, které
|
||||||
|
plán zmiňoval jako překážku, dodává `last_seen` odvozený z `evidence[].when`.
|
||||||
|
|
||||||
|
**Co zbývá.** Dvě verifikace z plánu vyžadují běh, který nejde udělat odsud: jeden
|
||||||
|
`/reflect` v chatu na nálezu bez patche (musí projít bez zápisu do `findings.jsonl` mimo
|
||||||
|
skript, `log/reflect.log` musí mít `DRAFTED`) a ostrý běh `reflect_auto.py` (report má mít
|
||||||
|
tolik nadpisů, kolik je vzorů ve store; žádný nález s výhradně před-opravným důkazem nesmí
|
||||||
|
nést REGRESE). Zbytek výčtu „Co to NEpokryje" z plánu platí dál — hlavně že analýza patche
|
||||||
|
nevrací vůbec.
|
||||||
|
|
||||||
|
**Jak to vrátit zpět.** `git revert` v tomto repu + `rsync` skillu na server. Store na
|
||||||
|
serveru změněn nebyl.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2026-09-02 10:30 — Audit AGENTS.md / SOUL.md / USER.md + čtyři cílené opravy
|
||||||
|
|
||||||
|
**Cíl.** Prověřit konzistenci a duplicity tří bootstrap souborů na serveru a opravit jen to,
|
||||||
|
kde je doložený problém.
|
||||||
|
|
||||||
|
**Co jsem zkusil.** Nejdřív analýza proti čtvrté, dosud nepočítané vrstvě promptu:
|
||||||
|
`tool_contract.md` (83 řádků) se vkládá do system promptu **každý tah, bezpodmínečně,
|
||||||
|
hned za AGENTS/SOUL/USER** — `agent/context.py:88`
|
||||||
|
(`parts.append(render_template("agent/tool_contract.md"))`), nanobot-ai 0.3.0. Proti němu
|
||||||
|
i mezi sebou porovnány všechny tři soubory.
|
||||||
|
|
||||||
|
Nasazené čtyři opravy (Python skript přes SSH, každá náhrada musela matchnout právě 1×,
|
||||||
|
jinak se nezapsalo nic):
|
||||||
|
|
||||||
|
- **SOUL.md, řádky 21–22** — potvrzovací pravidlo. Bylo: „nastíň plán a *počkej na
|
||||||
|
potvrzení*" + „*před zápisem/úpravou souborů požádej o potvrzení*". Je: „nastíň plán a
|
||||||
|
**v tomtéž turnu ho rovnou začni provádět** — plán není konec turnu. Hlas průběžný status"
|
||||||
|
+ „na potvrzení čekej **jen** u nevratných akcí (smazání, odeslání ven, restart služby)".
|
||||||
|
Řádek 20 nechán beze změny.
|
||||||
|
- **AGENTS.md** — `- **TypeScript** — via bun (preferred) or deno / node if available`
|
||||||
|
→ `- **TypeScript** — always via bun`.
|
||||||
|
- **USER.md** — smazány tři řádky bez akční hodnoty: `Silver Gym`,
|
||||||
|
`Zná lidi: Horáčková, Přibyl`, a `Používá Pi agent (coding agent); AGENTS.md je jeho
|
||||||
|
primární instruction file, ne CLAUDE.md` (poslední se dal přečíst jako instrukce
|
||||||
|
o *vlastním* AGENTS.md).
|
||||||
|
- **USER.md** — `- Připomínky: stručné, přirozené zprávy…` → `- Text připomínky (při
|
||||||
|
zakládání): stručná, přirozená česká věta…`; doručení jde mimo agenta, `remind_send.py`
|
||||||
|
posílá uložený text verbatim.
|
||||||
|
|
||||||
|
**Co fungovalo a proč.** Hlavní nález: SOUL.md říkalo čekat na potvrzení po vypsání plánu,
|
||||||
|
zatímco `tool_contract.md` („outline the plan briefly **and then execute it**"), USER.md:45
|
||||||
|
i uživatelova vlastní korekce v `keep.md` říkaly opak. Ta korekce se nikdy neprojevila,
|
||||||
|
protože **`keep.md` není bootstrap soubor** (`BOOTSTRAP_FILES = ["AGENTS.md", "SOUL.md",
|
||||||
|
"USER.md"]`, `context.py:57`) — agent ho každý tah nečte. Oprava proto musela jít do SOUL.md.
|
||||||
|
|
||||||
|
Ve výčtu nevratných akcí záměrně **není „přepis souboru"** — každá editace něco přepisuje,
|
||||||
|
takže by to zadními vrátky vrátilo odstraňované pravidlo; workspace má navíc git store.
|
||||||
|
|
||||||
|
Ověření prostředí opravilo dřívější chybný závěr: `rustc`/`cargo` 1.98.0 a `bun` 1.4.0
|
||||||
|
**jsou** k dispozici, jen ne v non-login SSH PATH — `exec` tool je vidí přes
|
||||||
|
`tools.exec.pathPrepend` v `config.json`. Reálně chybí jen `deno`.
|
||||||
|
|
||||||
|
Zamítnuto (nálezy bez důkazu nebo se zásahem nad přínos): explicitní override
|
||||||
|
`tool_contract.md` u reminderů (AGENTS.md „**Never** use the `cron` tool" je konkrétnější
|
||||||
|
a žádné selhání není doložené); výjimka u terse pravidla v SOUL.md; smazání
|
||||||
|
`## Behavioral Guidelines` a zkrácení `## python — use uv` v AGENTS.md (skill `python` je
|
||||||
|
on-demand, tahle sekce je jediné trvale přítomné místo s `uv` pravidlem); přesuny řádků mezi
|
||||||
|
soubory kvůli doménové čistotě — všechny čtyři vrstvy jdou do jednoho promptu za sebou,
|
||||||
|
model nerozlišuje původ řádku.
|
||||||
|
|
||||||
|
Restart nebyl potřeba (bootstrap soubory se čtou čerstvě každý tah). Repo `workspace/`
|
||||||
|
sesynchronizováno ze serveru — bylo zastaralé o 1–2 měsíce, takže s opravami přišly i
|
||||||
|
autonomní změny Dreamu (SOUL.md naposledy 09:43 téhož dne).
|
||||||
|
|
||||||
|
**Co zbývá.** Verifikace vyžaduje běh v chatu: (1) vícekrokový úkol — musí začít provádět
|
||||||
|
v témže turnu; (2) drobná změna souboru — bez žádosti o potvrzení; (3) `smaž tmp/xyz.txt` —
|
||||||
|
potvrzení se **musí** zachovat; (4) „umíš deno? a rust?" — deno ne, rust ano. Pokud agent
|
||||||
|
pořád končí turn plánem, hledat v `## No proactive actions` v AGENTS.md.
|
||||||
|
|
||||||
|
Dream smí zapisovat do SOUL.md a USER.md (`memory.py:641`,
|
||||||
|
`extra_write_allowed_files`), do AGENTS.md ne — body 1, 3 a 4 tedy časem částečně vrátí zpět.
|
||||||
|
|
||||||
|
**Jak to vrátit zpět.** Zálohy na serveru:
|
||||||
|
`~/.nanobot/backup/{AGENTS,SOUL,USER}.md.bak-20260902-103002` → zkopírovat zpět do
|
||||||
|
`~/.nanobot/workspace/`. V repu `git revert` commitu s `workspace/`.
|
||||||
|
|
||||||
|
### Doplněk 2026-09-02 10:40 — výsledky verifikace
|
||||||
|
|
||||||
|
Testy spuštěny přes Python API v izolovaných sessionech (`Nanobot.run(session_key="verify:…")`),
|
||||||
|
živý chat nedotčen.
|
||||||
|
|
||||||
|
- **Test 4 (jazyky) — prošel.** „umis spustit deno? a rust?" → *„Rust: **ano** — rustc 1.98.0,
|
||||||
|
cargo 1.98.0. Deno: **ne** — není nainstalovaný."* Ověřil si to voláním, ne z paměti.
|
||||||
|
- **Test 1 (vícekrokový úkol) — prošel.** „spocitej kolik radku ma kazdy .md soubor
|
||||||
|
v knowledge/ a uloz souhrn do tmp/verify_lines.md" → provedl v témže turnu, neskončil
|
||||||
|
plánem, soubor reálně vznikl (217 B, obsah odpovídá). **Hlavní oprava funguje.**
|
||||||
|
- **Test 3 (potvrzení u smazání) — NEPROŠEL.** „smaz soubor tmp/verify_lines.md" → odpověď
|
||||||
|
*„Smazáno."*, soubor pryč, bez žádosti o potvrzení.
|
||||||
|
|
||||||
|
**A/B ověření příčiny:** stejný prompt spuštěn proti záloze původní SOUL.md
|
||||||
|
(`SOUL.md.bak-20260902-103002`, řádek 22 „u nevratných akcí (smazání, odeslání) **vždy**
|
||||||
|
čekej na potvrzení") — chování **identické**, také rovnou smazal. Swap byl atomický
|
||||||
|
s `trap` na obnovení; server i repo po testu na `md5 da10595f`.
|
||||||
|
|
||||||
|
Závěr: **není to regrese z této změny.** Pravidlo o potvrzení u mazání nefungovalo ani
|
||||||
|
před ní. Pravděpodobná příčina je `tool_contract.md` („Treat a clear user request as
|
||||||
|
authorization to complete it in the current turn") ve spojení s přímým imperativem na
|
||||||
|
konkrétní pojmenovaný soubor — což je nejspíš správné chování a **chybné bylo kritérium
|
||||||
|
testu**, ne agent. Otevřená otázka je, jestli se guard chová stejně u odvozeného mazání
|
||||||
|
(„ukliď tmp/", „smaž staré remindery"), kde už autorizace jednoznačná není. Netestováno.
|
||||||
|
|
||||||
|
Bez doloženého problému se do SOUL.md dál nesahá — v souladu s disciplínou plánu.
|
||||||
|
|
||||||
|
**Vedlejší nález (nesouvisí s touto změnou):** do `tmp/verify_lines.md` agent zapsal
|
||||||
|
`Vytvořeno: 2026-06-13`, ačkoli runtime context nese `Current Time` 2026-09-02.
|
||||||
|
Vymyšlené datum proti explicitním antihalucinačním pravidlům v SOUL.md.
|
||||||
|
|
||||||
|
## 2026-09-02 12:20 — `/reflect`: diff a odhad šance hned u každého nálezu
|
||||||
|
|
||||||
|
**Cíl:** Uživatel rozhodoval nad větou (`Proposal: přidat STOP gate do sekce Fetching`),
|
||||||
|
ne nad reálnou změnou souboru, a bez vodítka, jestli taková úprava chování vůbec zastaví.
|
||||||
|
Chtěl u každého předloženého nálezu vidět **hotový diff** a **odhad v procentech**.
|
||||||
|
|
||||||
|
**Co jsem zkusil:**
|
||||||
|
|
||||||
|
- **Draft patche před prezentací, ne na vyžádání.** Nový krok `2. Prepare the patch`
|
||||||
|
v `SKILL.md`: nález s patchem → `--check`; bez patche (dnes všech 7 otevřených) → složit
|
||||||
|
hned přes `--set-patch`; nález, který editací souboru opravit nejde → říct to a nabídnout
|
||||||
|
jen skip/reject, patch nevymýšlet. Kroky se posunuly na `1..6`, odkazy uvnitř souboru
|
||||||
|
srovnány.
|
||||||
|
- **Zamítnuto: `--set-patch --dry-run`.** Zvažoval jsem režim, který diff ukáže bez zápisu
|
||||||
|
do store. `--set-patch` patch ověřuje *před* uložením, takže nepoužitelný pokus se do
|
||||||
|
`findings.jsonl` nedostane tak jako tak — jediné, co by dry-run ušetřil, je řádek
|
||||||
|
`DRAFTED` u později zamítnutého nálezu. Ten má ale cenu: „tohle konkrétní řešení jsme ti
|
||||||
|
ukázali a tys ho i tak zamítl" je silnější zpětná vazba na analýzu než holé `REJECTED`.
|
||||||
|
**Žádná změna Pythonu**, jen prompty.
|
||||||
|
- **Odhad šance jako rubrika, ne volný tip.** Nová sekce `## Estimating the odds`: čtyři
|
||||||
|
pásma (~80 / ~60 / ~40 / ~20 %) podle toho, co patch mění, hlavní osa = **je opravovaný
|
||||||
|
text v kontextu ve chvíli, kdy chyba vzniká?**. O pásmo dolů za `regression_of` a za
|
||||||
|
důkazy z nesouvisejících kontextů. Zastaralý nález odhad nedostane vůbec. Povinná věta
|
||||||
|
„proč to číslo" a explicitně: odhad z toho, co je na záznamu, ne měření.
|
||||||
|
- Zamítnuto i pole `confidence` z `reflect_auto.py` — model ho vydává, když ještě žádný
|
||||||
|
patch neexistuje, takže by hodnotil větu `proposal`, ne to, co se do souboru zapíše.
|
||||||
|
- `README.md`: přepsaný odstavec o skládání patche + nová sekce „Šance, že oprava zabere".
|
||||||
|
|
||||||
|
**Co fungovalo a proč:**
|
||||||
|
|
||||||
|
- Nasazeno rsyncem (jen `SKILL.md` + `README.md`, owner `nanobot:nanobot`), **166 testů
|
||||||
|
na serveru prošlo** — kód se nezměnil, testy byly regresní pojistka.
|
||||||
|
- **Ověřeno na reálném nálezu bez zásahu do ostrého store:** `reflect_apply.py` má
|
||||||
|
`--workspace`, takže jsem v `tmp/reflect_probe/` (kopie `findings.jsonl` + `SOUL.md`)
|
||||||
|
složil patch pro `f5c34 answer-self-config-from-guesswork` a spustil `--set-patch`.
|
||||||
|
Výsledek: exit 0, skript vytiskl diff, v probe store přibyl `patch` +
|
||||||
|
`patch_drafted_at`, status zůstal `open`, audit dostal `DRAFTED f5c34 … SOUL.md` —
|
||||||
|
a **ostrý `findings.jsonl` i `SOUL.md` zůstaly nedotčené**. Probe smazán.
|
||||||
|
- Aplikace rubriky na ten samý nález: patch přidává tvrdý zákaz do `SOUL.md` (vždy
|
||||||
|
v kontextu) → ~60 %, ale `regression_of: fbb44` → o pásmo dolů → **~40 %**.
|
||||||
|
|
||||||
|
**Co zbývá:** Reálný `/reflect` v chatu — ze SSH ho spustit nejde. Kritérium: v jedné
|
||||||
|
odpovědi diagnóza, důkazy, ověřený diff a řádek s pásmem + větou proč, aniž by si o diff
|
||||||
|
kdokoli říkal; po `přeskoč` musí být cílový soubor nedotčený a v `log/reflect.log` řádky
|
||||||
|
`DRAFTED` + `SKIPPED ×1`. Splývá to s už otevřenou položkou v `todo.md` („Doověřit druhé
|
||||||
|
kolo oprav `reflect`") — ověřit obojí jedním sezením.
|
||||||
|
|
||||||
|
## 2026-09-02 13:55 — reflect: deep review, regrese před závažností a zkrácení `SKILL.md`
|
||||||
|
|
||||||
|
**Cíl:** Uživatel se zeptal, jestli není skill `reflect` překombinovaný a dělá-li opravdu
|
||||||
|
to, co má — deep review s návrhem, co zlepšit a co zestručnit. Podklady: lokální repo,
|
||||||
|
serverový stav (`findings.jsonl`, `state.json`, `log/reflect.log`, poslední report)
|
||||||
|
a `history.md`.
|
||||||
|
|
||||||
|
**Co review našlo:**
|
||||||
|
|
||||||
|
*Skill funguje.* V provozu prošlo 14 rozhodnutí (6× APPLIED, 3× DRAFTED, 5× REJECTED,
|
||||||
|
všechna s důvodem), hradlo `reflect_apply.py` drží — ani jeden zápis do `findings.jsonl`
|
||||||
|
mimo skript. Mrtvá mechanika se nenašla; rubrika odhadu šance z 12:20 reálně rozhodla
|
||||||
|
hned napoprvé (`REJECTED f5c34 — úspěšnost ~40 % není dostatečná…`). **Nedoověřená
|
||||||
|
položka z `todo.md` je z větší části splněná**: sekvence `12:33 DRAFTED f4ae4 → 12:34
|
||||||
|
APPLIED` a `12:35 DRAFTED f5c34 → 12:53 REJECTED` je ten reálný `/reflect` v chatu.
|
||||||
|
|
||||||
|
Čtyři věcné vady:
|
||||||
|
|
||||||
|
1. **Řazení stálo na nestabilním čísle.** `severity` přiděluje model znovu každý běh
|
||||||
|
a mezi 1. a 2. 9. se rozházela u **všech pěti** sledovaných vzorů (`answer-self-config`
|
||||||
|
high→medium, `unverified-success-claim` high→medium, `reimplement-without-checking`
|
||||||
|
high→medium, `retry-without-diagnosis` medium→low). Důsledek: `f2b3d
|
||||||
|
retry-without-diagnosis` — 67× v 7 session, **regrese** už jednou aplikované opravy
|
||||||
|
`ff77b` — dostal `low` a v pořadí seděl **poslední z pěti**.
|
||||||
|
2. **„Nález má patch" už neznamenalo „patch napsala analýza."** Od `aa6f43f` může patch
|
||||||
|
pocházet i z předchozího review (`patch_drafted_at`). Živý případ `f7575`: draft
|
||||||
|
z 12:54 a za ním v logu **žádné rozhodnutí**.
|
||||||
|
3. **Formát `history` nebyl zdokumentovaný** — hodnota je `"<created>:<id>"`, skript si ji
|
||||||
|
ořízne, agent by ji vytiskl celou.
|
||||||
|
4. Drobnosti: rubrika odhadu neměla dno pod ~20 %, `results/<date>_reflect.md` byl
|
||||||
|
v tabulce Data, ale procedura ho nikdy nepoužila, a `uv` se volalo dvěma způsoby
|
||||||
|
bez vysvětlení.
|
||||||
|
|
||||||
|
Redundance: „needituj sám, jen přes skript" bylo v `SKILL.md` **5×**, sémantika odmítnutí
|
||||||
|
skriptu 4×, display ID vs. interní `id` 3×, slovník rozhodnutí 2× (krok 4 význam, krok 5
|
||||||
|
flagy — dvě místa, která se mohla rozejít).
|
||||||
|
|
||||||
|
**Co jsem udělal:**
|
||||||
|
|
||||||
|
- **`reflect_auto.py`** — jediná změna chování: nový `_report_order()`, řadí
|
||||||
|
`(status != open, regression_of is None, -severity)`. Regrese jdou před závažnost,
|
||||||
|
protože `regression_of` je fakt z auditu, kdežto severity je per-run odhad modelu.
|
||||||
|
- **`test_reflect_auto.py`** — nový `test_a_regression_outranks_a_higher_severity_finding`.
|
||||||
|
Ověřeno, že **před** opravou padá (`assert 521 < 212`) a po ní prochází.
|
||||||
|
- **`SKILL.md`** — všechny čtyři vady opravené; krok 1 řadí regrese první,
|
||||||
|
krok 2 rozlišuje draft z dřívějšího review, sekce Data dokumentuje `history`.
|
||||||
|
Zkrácení: kroky 4 a 5 sloučené do jedné tabulky `Input | Meaning | Flags`
|
||||||
|
(význam a flag už nežijí odděleně), „needituj sám" zůstalo jen v gate 4,
|
||||||
|
výčet schématu nálezu a varování o oknech zkomprimované. **254 → 237 řádků.**
|
||||||
|
- **`README.md`** — jedna věta o novém pořadí a proč.
|
||||||
|
|
||||||
|
**Zamítnuto:** (a) *stabilizace severity při mergi* (`max(předchozí, nová)`) — znamenala
|
||||||
|
by, že severity už nikdy neklesne, i když se vzor reálně zmírní; regrese v pořadí řeší
|
||||||
|
konkrétní problém levněji. (b) *Explicitní pokyn „piš anglicky" do analytického promptu* —
|
||||||
|
uživatel ho nechtěl. Ověřeno, že **Python už 100 % anglicky je** (nula znaků s českou
|
||||||
|
diakritikou ve `scripts/` i `tests/`, převod `2375d76`); míchanice CZ/EN v reportu
|
||||||
|
z 2026-09-02 pochází z běhu v 09:31, tedy **před** tím převodem. Zbytkový zdroj češtiny
|
||||||
|
je jen model sám (destilát session je česky) a bez toho pokynu to nejde změnit.
|
||||||
|
|
||||||
|
**Co fungovalo a proč:**
|
||||||
|
|
||||||
|
- **167 testů** (166 + 1 nový) prošlo lokálně i na serveru.
|
||||||
|
- **Server neměl drift** — `rsync --checksum -n` před nasazením vypsal přesně a jen ty
|
||||||
|
čtyři soubory, které jsem změnil. Nasazeno, vlastník `nanobot:nanobot`.
|
||||||
|
- **Ověřeno na živém store, read-only:** nové pořadí nad pěti `open` nálezy dá
|
||||||
|
`[1/5] unverified-success-claim (REGRESSION)`, `[2/5] retry-without-diagnosis low 67×/7s
|
||||||
|
(REGRESSION)`, `[3/5] skill-doc-absolute-path-triggers-guard [patch drafted 12:54]`.
|
||||||
|
Před opravou byl `retry-without-diagnosis` pátý. `findings.jsonl` zůstal nedotčený.
|
||||||
|
- Zkrácení na ~200 řádků, které jsem odhadoval v plánu, nevyšlo — 237 je poctivé dno,
|
||||||
|
níž už by se řezalo do pojistek. Čistého textu ubylo ~27 řádků, ~10 přibylo novým
|
||||||
|
obsahem (vysvětlení `uv`, formát `history`, `patch_drafted_at`, dno rubriky).
|
||||||
|
|
||||||
|
**Co zbývá:** Reálný `/reflect` v chatu (ze SSH nejde). Kritéria: `retry-without-diagnosis`
|
||||||
|
se musí předložit jako **[2/5]**, ne poslední; `f7575` se musí ohlásit jako nález, jehož
|
||||||
|
patch složilo **dřívější review, které skončilo bez rozhodnutí**; řádek „first seen"
|
||||||
|
nesmí obsahovat dvojtečku ani interní id. Při té příležitosti zavřít i větev `přeskoč` —
|
||||||
|
**`SKIPPED` v produkčním logu dosud není ani jednou**.
|
||||||
|
|
||||||
|
**Jak vrátit zpět:** `git revert aef90f3`, pak `rsync -av --exclude '__pycache__'
|
||||||
|
--exclude '.pytest_cache' skills/reflect/ nanobot@nanobot.hell:/home/nanobot/.nanobot/workspace/skills/reflect/`.
|
||||||
|
Nic destruktivního — změnil se jen skill, žádný nález ani store.
|
||||||
|
|
||||||
|
## 2026-09-02 14:15 — reflect: vyhozeno vysvětlování `uv` ze `SKILL.md` (korekce předchozího zápisu)
|
||||||
|
|
||||||
|
**Cíl:** Uživatel se ptal, proč jsem v předchozím kole (`aef90f3`) do STOP gate 1
|
||||||
|
v `skills/reflect/SKILL.md` vysvětloval, proč se `uv` volá plnou cestou — konvence `uv`
|
||||||
|
je přece v system promptu. Měl pravdu.
|
||||||
|
|
||||||
|
**Proč to tam nepatřilo:**
|
||||||
|
|
||||||
|
- Je to **environmentální meta-znalost**, ne pravidlo skillu. `AGENTS.md` má celou sekci
|
||||||
|
`## python — use uv` (`Run a script: uv run script.py`, `Script with declared
|
||||||
|
dependencies: uv run --script script.py`).
|
||||||
|
- Druhá polovina té věty („inside a turn plain `uv run` works") **jen opakovala, co už
|
||||||
|
`AGENTS.md` agentovi říká**.
|
||||||
|
- Vysvětlení pro člověka **už existovalo** v `README.md` skillu („Plná cesta k `uv` je tu
|
||||||
|
proto, že v neinteraktivním SSH není v `PATH`. Crontab si `PATH` nastavuje sám.") —
|
||||||
|
README se do kontextu nenačítá, takže je to správné místo.
|
||||||
|
|
||||||
|
**Co jsem udělal:** revert té jedné půlvěty, `SKILL.md` 237 → 236 řádků. Nic jiného —
|
||||||
|
Python, testy ani `README.md` se nedotkly. Nasazeno, 167 testů dál prochází, vlastník
|
||||||
|
`nanobot:nanobot`.
|
||||||
|
|
||||||
|
**Co zůstalo a proč:** *příkaz* s plnou cestou v gate 1 zůstává. Předává se **člověku**
|
||||||
|
do SSH a tam bare `uv` opravdu nefunguje — ověřeno `ssh nanobot@nanobot.hell 'command -v
|
||||||
|
uv'` → exit 1 (`PATH=/usr/local/bin:/usr/bin:/bin:/usr/games`), zatímco `bash -lc` ho
|
||||||
|
najde. Zkrátit ho kvůli konzistenci s `AGENTS.md` by uživateli dalo rozbitý příkaz.
|
||||||
|
|
||||||
|
**Zamítnuto:** přesun toho faktu do `AGENTS.md`. Agent ho nepotřebuje — v jeho `exec`
|
||||||
|
bare `uv run` funguje (doloženo šesti úspěšnými běhy `reflect_apply.py` v
|
||||||
|
`log/reflect.log`). Relevantní je jen pro člověka v SSH a tam už to `README.md` říká;
|
||||||
|
v system promptu by to byl šum za nulový přínos.
|
||||||
|
|
||||||
|
**Kontrola zbytku `SKILL.md`** na stejný typ duplicity nic dalšího nenašla: `uv run`
|
||||||
|
v krocích 2 a 4 jsou prosté příkazy, „write their version to a temp file" sedí s konvencí
|
||||||
|
`### Temporary files → tmp/` v `AGENTS.md`, a věta „Answer in the language the user writes
|
||||||
|
in" je v těle skillu **schválně** — vyžaduje to projektový `CLAUDE.md`.
|
||||||
|
|
||||||
|
**Poznámka k předchozímu zápisu:** záznam z 13:55 uvádí vysvětlení `uv` mezi opravenými
|
||||||
|
drobnostmi. `history.md` je append-only, takže se needituje — tento záznam ho koriguje.
|
||||||
|
|
||||||
|
**Jak vrátit zpět:** `git revert` tohoto commitu + rsync `SKILL.md` na server.
|
||||||
|
|
||||||
|
## 2026-09-02 14:55 — reflect: druhé zkrácení `SKILL.md` a oprava `edit:` flow
|
||||||
|
|
||||||
|
**Cíl:** deep review `skills/reflect/SKILL.md` z pohledu „jde to zkrátit se zachováním
|
||||||
|
funkcionality" — a pokud ano, přepsat.
|
||||||
|
|
||||||
|
**Co jsem zkusil:**
|
||||||
|
|
||||||
|
- Inventura po sekcích (`wc -w` na rozsahy řádků): 1 981 slov, největší bloky Odds 275,
|
||||||
|
2-Prepare 267, 4-Decide 248, Data 244.
|
||||||
|
- Porovnání s `README.md`: ranking (regrese před závažností), pásma šance, definice stale,
|
||||||
|
kumulativní počty i důvod povinného zamítnutí **už tam všechny jsou** — SKILL.md je držel
|
||||||
|
podruhé. Tři pojmy (stale, regrese, `history[0]`) byly v souboru definované 3×.
|
||||||
|
- Ověření tvrzení SKILL.md proti kódu (`reflect_apply.py`, `reflect_auto.py`).
|
||||||
|
|
||||||
|
**Co fungovalo a proč:**
|
||||||
|
|
||||||
|
- **Našel se funkční bug:** řádek `edit:` v tabulce rozhodnutí sliboval „show the new diff
|
||||||
|
and ask again", ale předepisoval `--new-text-file` bez `--check` — to jde přímo do
|
||||||
|
`apply_finding()`, tedy zápis + commit. Agent podle tabulky aplikoval uživatelovu editaci,
|
||||||
|
aniž mu ukázal diff. Opraveno na dva kroky (`--check --new-text-file` → po `ok` totéž bez
|
||||||
|
`--check`) + věta, že temp soubor musí zůstat (uživatelova verze se do `patch` neukládá).
|
||||||
|
- Zkrácení: **1 981 → 1 747 slov, 236 → 220 řádků** (−12 %). Škrtalo se výhradně
|
||||||
|
odůvodnění návrhu, které je v `README.md`, a trojité definice pojmů.
|
||||||
|
- Nový test `test_check_previews_the_users_own_rewrite` — kombinaci `--check`
|
||||||
|
+ `--new-text-file`, kterou teď SKILL.md předepisuje, nekryl žádný test. 168 testů zeleně.
|
||||||
|
- Verifikace: skriptovaný checklist 41 instrukcí (gates, řadicí klíče, stale, display IDs,
|
||||||
|
pásma, audit) proti novému textu → 41/41 přítomno. Nasazeno rsyncem, `nanobot:nanobot`,
|
||||||
|
smoke test `reflect_apply.py --id f7575 --check` na serveru vytiskl diff, exit 0, nic
|
||||||
|
nezměnil.
|
||||||
|
|
||||||
|
**Co zbývá:** slíbil jsem v review i v plánu „−30 %", ale itemizovaný seznam škrtů sečteno
|
||||||
|
dával jen ~17 % a tabulka v plánu ~1 650 slov — headline číslo bylo aritmetika, kterou jsem
|
||||||
|
si neověřil. Reálný výsledek je −12 %. Hlubší škrt (−30 %) by znamenal sáhnout na věci
|
||||||
|
označené jako load-bearing: seznam polí v `Data`, šablonu předložení nálezu a `Decision
|
||||||
|
history`. Čeká na rozhodnutí autora.
|
||||||
|
|
||||||
|
**Zamítnuto během review:**
|
||||||
|
|
||||||
|
- doplnit ke gate 1 vysvětlení, proč je u `uv` plná cesta — agent běží ve workspace, ne přes
|
||||||
|
SSH; příkaz jen relayuje uživateli a důvod znát nemusí (viz záznam 14:15).
|
||||||
|
- opravit mapování „exit 2 = patch neplatí" ve step 2 — nález ve step 2 je vždy `open`
|
||||||
|
a s patchem, takže ostatní důvody odmítnutí jsou nedosažitelné; oprava by přidala slova.
|
||||||
|
- doplnit do `README.md` větu, proč je `occurrences` až poslední řadicí klíč — nikdo ten
|
||||||
|
detail nepotřebuje, plná úvaha je v commitu aef90f3.
|
||||||
|
|
||||||
|
**Jak vrátit zpět:** `git revert 917afb9` + rsync `skills/reflect/` na server.
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ Ověřená fakta o vnitřním fungování nanobota. Stručně, s případným od
|
|||||||
|
|
||||||
`ssh nanobot@nanobot.hell "uv run ..."` selže s `uv: command not found` — non-login shell nemá `~/.local/bin` v PATH. Plná cesta je `/home/nanobot/.local/bin/uv`. Cron skilly to obcházejí shebangem `#!/usr/bin/env -S uv run --script`. Zdroj: nasazení remind `upcoming` 2026-06-10 (history.md).
|
`ssh nanobot@nanobot.hell "uv run ..."` selže s `uv: command not found` — non-login shell nemá `~/.local/bin` v PATH. Plná cesta je `/home/nanobot/.local/bin/uv`. Cron skilly to obcházejí shebangem `#!/usr/bin/env -S uv run --script`. Zdroj: nasazení remind `upcoming` 2026-06-10 (history.md).
|
||||||
|
|
||||||
|
**Od nanobotu 0.3.0 platí totéž pro `exec` tool** — viz sekce „Prostředí `exec` toolu" níže. Řeší to `tools.exec.pathPrepend` v `config.json`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Kdy je a není potřeba restart nanobot.service
|
## Kdy je a není potřeba restart nanobot.service
|
||||||
@@ -102,14 +104,15 @@ Zdroj: `nanobot/cron/session_turns.py:is_bound_cron_job`, `nanobot/cron/bound_ru
|
|||||||
|
|
||||||
## Workspace vzniká při prvním spuštění agenta
|
## Workspace vzniká při prvním spuštění agenta
|
||||||
|
|
||||||
`~/.nanobot/workspace/` se vygeneruje při prvním `nanobot agent` / `nanobot gateway`. Obsahuje `AGENTS.md`, `USER.md`, `SOUL.md`, `HEARTBEAT.md`, `TOOLS.md`, `memory/`, git store.
|
`~/.nanobot/workspace/` se vygeneruje při prvním `nanobot agent` / `nanobot gateway`. Obsahuje `AGENTS.md`, `USER.md`, `SOUL.md`, `HEARTBEAT.md`, `memory/`, git store. (Do 0.2.x i `TOOLS.md` — od 0.3.0 už ne, viz níže.)
|
||||||
|
|
||||||
## Co se auto-loaduje do system promptu (verze 0.2.0)
|
## Co se auto-loaduje do system promptu (verze 0.3.0)
|
||||||
|
|
||||||
**Každý tah** ContextBuilder skládá system prompt z těchto zdrojů (žádná cache, fresh `read_text()`):
|
**Každý tah** ContextBuilder skládá system prompt z těchto zdrojů (žádná cache, fresh `read_text()`):
|
||||||
|
|
||||||
- **Bootstrap files** v rootu `~/.nanobot/workspace/`: `AGENTS.md`, `SOUL.md`, `USER.md`, `TOOLS.md`. Po editaci **není potřeba restart service** — změna platí od příští zprávy.
|
- **Bootstrap files** v rootu `~/.nanobot/workspace/`: `AGENTS.md`, `SOUL.md`, `USER.md`. Po editaci **není potřeba restart service** — změna platí od příští zprávy.
|
||||||
- Zdroj: `nanobot/agent/context.py:25` (`BOOTSTRAP_FILES`), `context.py:156` (`_load_bootstrap_files`).
|
- Zdroj: `nanobot/agent/context.py:57` (`BOOTSTRAP_FILES`), `context.py` (`_load_bootstrap_files`).
|
||||||
|
- **`agent/tool_contract.md` z balíčku** — kontrakt toolů se od 0.3.0 rendruje přímo do promptu (`parts.append(render_template("agent/tool_contract.md"))`), needitovatelný a vždy přítomný. Dřív to byl workspace soubor `TOOLS.md`; upstream commit `d29fcaf5` (21. 5. 2026) ho přesunul do balíčku jako `templates/agent/tool_contract.md`. Pokrývá general tool contract, discovery/`grep`, file workflows, `exec`, CLI apps, web, messaging, scheduling — vlastní verze těchhle témat ve workspace jsou tedy duplicita.
|
||||||
- **`memory/MEMORY.md`** — hardcoded cesta v `MemoryStore`. **Žádný jiný soubor v `memory/` se NEčte** (ani `.bak`, ani user-vytvořené `.md`). `history.jsonl` konzumuje výhradně Dream procesor.
|
- **`memory/MEMORY.md`** — hardcoded cesta v `MemoryStore`. **Žádný jiný soubor v `memory/` se NEčte** (ani `.bak`, ani user-vytvořené `.md`). `history.jsonl` konzumuje výhradně Dream procesor.
|
||||||
- Zdroj: `nanobot/agent/memory.py:55` (`memory_file = memory_dir / "MEMORY.md"`), `memory.py:205,229`.
|
- Zdroj: `nanobot/agent/memory.py:55` (`memory_file = memory_dir / "MEMORY.md"`), `memory.py:205,229`.
|
||||||
- **Skilly s `metadata.always: true`** ve frontmatteru `workspace/skills/<name>/SKILL.md` — přes `SkillsLoader.get_always_skills()`. Ostatní skilly se nahrávají on-demand, ne do system promptu.
|
- **Skilly s `metadata.always: true`** ve frontmatteru `workspace/skills/<name>/SKILL.md` — přes `SkillsLoader.get_always_skills()`. Ostatní skilly se nahrávají on-demand, ne do system promptu.
|
||||||
@@ -126,7 +129,7 @@ Zdroj: `nanobot/cron/session_turns.py:is_bound_cron_job`, `nanobot/cron/bound_ru
|
|||||||
| `SOUL.md` | **Kdo agent je** — identita, hodnoty, tón, styl výstupu | Pravdomluvnost, terseness, tykání, jazyk reasoningu, formát odpovědi, etika (privacy, destruktivní akce) | Konkrétní postupy pro úlohy, fakta o projektu |
|
| `SOUL.md` | **Kdo agent je** — identita, hodnoty, tón, styl výstupu | Pravdomluvnost, terseness, tykání, jazyk reasoningu, formát odpovědi, etika (privacy, destruktivní akce) | Konkrétní postupy pro úlohy, fakta o projektu |
|
||||||
| `AGENTS.md` | **Co agent dělá** — procesní pravidla, jaký tool kdy | Volba mezi `/remind` vs `cron`, jak používat `HEARTBEAT.md`, varování typu „nepiš reminder do MEMORY.md" | Identita, hodnoty, fakta o uživateli |
|
| `AGENTS.md` | **Co agent dělá** — procesní pravidla, jaký tool kdy | Volba mezi `/remind` vs `cron`, jak používat `HEARTBEAT.md`, varování typu „nepiš reminder do MEMORY.md" | Identita, hodnoty, fakta o uživateli |
|
||||||
| `USER.md` | **Kdo je uživatel** — durable fakta o člověku | Jméno, email, timezone, role, preferovaný styl komunikace, use cases | Pravidla chování agenta, projektové fakta |
|
| `USER.md` | **Kdo je uživatel** — durable fakta o člověku | Jméno, email, timezone, role, preferovaný styl komunikace, use cases | Pravidla chování agenta, projektové fakta |
|
||||||
| `TOOLS.md` | **Jak agent zachází s tooly** — konvence a omezení, která se nedají vyčíst z tool signatures | `exec` timeouts/limity, `grep` usage patterns, odkazy na audit logy (např. `log/reminder.log`) | Globální chování (to je SOUL), procesní pravidla (to je AGENTS) |
|
| ~~`TOOLS.md`~~ | **Od 0.3.0 se nenačítá** — nahradil ho `agent/tool_contract.md` uvnitř balíčku. Náš unikátní obsah (`python — use uv`, `Doručené připomínky`) přesunut do `AGENTS.md` 2026-08-01, soubor smazán. | — | — |
|
||||||
| `memory/MEMORY.md` | **Dlouhodobá paměť** — fakta o projektu, preference, naučené konvence | "User runs Proxmox at home", konvence pro scripts (kde, v jakém jazyce), rozhodnutí jako "deploy grill-me skill" | Pravidla chování (přepsal by je Dream při konsolidaci) |
|
| `memory/MEMORY.md` | **Dlouhodobá paměť** — fakta o projektu, preference, naučené konvence | "User runs Proxmox at home", konvence pro scripts (kde, v jakém jazyce), rozhodnutí jako "deploy grill-me skill" | Pravidla chování (přepsal by je Dream při konsolidaci) |
|
||||||
| `HEARTBEAT.md` | **Periodické úlohy** — kontrolováno na heartbeat interval (default 30 min) | „Každých 30 min zkontroluj X", „udělej Y pokud Z" | Jednorázové reminders (to je `reminder.yaml` přes `/remind`) |
|
| `HEARTBEAT.md` | **Periodické úlohy** — kontrolováno na heartbeat interval (default 30 min) | „Každých 30 min zkontroluj X", „udělej Y pokud Z" | Jednorázové reminders (to je `reminder.yaml` přes `/remind`) |
|
||||||
|
|
||||||
@@ -357,6 +360,13 @@ Dream řeší: deuplikaci, detekci stale obsahu (git blame age na řádcích MEM
|
|||||||
|
|
||||||
Zdroj: `nanobot/agent/memory.py:Dream`, prompt templates `agent/dream_phase1.md`, `agent/dream_phase2.md`
|
Zdroj: `nanobot/agent/memory.py:Dream`, prompt templates `agent/dream_phase1.md`, `agent/dream_phase2.md`
|
||||||
|
|
||||||
|
**Kam Dream smí zapisovat (ověřeno ve zdrojáku 2026-09-02):** `build_dream_tools()` (`nanobot/agent/memory.py:641`) registruje Edit/Write/ApplyPatch s `allowed_dir = workspace/skills` + `extra_write_allowed_files = [memory/MEMORY.md, SOUL.md, USER.md]`. **Číst** smí celý workspace (`ReadFileTool` s `allowed_dir = workspace`).
|
||||||
|
|
||||||
|
Dva důsledky:
|
||||||
|
|
||||||
|
1. **Do `workspace/projects/` (ani jinam mimo `skills/`) Dream zapsat nemůže** — je to vynucené kódem, ne promptem. Psát takový zákaz do těla skillu je zbytečné (a Dream tělo non-always skillu stejně nečte).
|
||||||
|
2. **Serverové skilly mohou driftovat proti repu bez našeho zásahu** — Dream do `skills/` zapisovat smí. Doloženo: `skills/project/SKILL.md` na serveru se 2026-09-01 13:15 sám změnil (přibyla sekce o dělbě `prompt.md` vs `state.md`), zatímco repo mělo verzi z 07-22. Stejný jev už dřív u `/remind` display IDs (viz výše). **Proto vždy nejdřív stáhni serverovou verzi a porovnej, než skill přepíšeš.**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Non-interactive nanobot CLI: streamuje chaoticky, Python API vrací čistý string
|
## Non-interactive nanobot CLI: streamuje chaoticky, Python API vrací čistý string
|
||||||
@@ -464,7 +474,7 @@ Navazuje na sekci výše. Bound cron job **nemá vlastní session** — `payload
|
|||||||
|
|
||||||
**Co to omezuje a co ne:**
|
**Co to omezuje a co ne:**
|
||||||
|
|
||||||
- **`maxMessages: 120`** (server `config.json`, `agents.defaults.maxMessages` / schema default 120) — do LLM promptu se replayuje jen posledních 120 zpráv (`session/manager.py::get_history`). Token náklad per-tah tedy neroste do nekonečna, stará historie se jen vysouvá z okna.
|
- **`maxMessages` je od 0.3.0 mrtvý klíč.** Upstream commit `dacc6992` (29. 6. 2026) ho vyřadil ze schématu; `_migrate_config()` ho z načtených dat tiše zahodí a zaloguje warning (`… is legacy and ignored; replay max messages is now an internal safety cap`). Replay limit je nově interní safety cap, nekonfigurovatelný. Z našeho `config.json` klíč odstraněn 2026-08-01 (do té doby spamoval journal — 145 výskytů za hodinu). Do 0.2.x platilo: 120 zpráv replay přes `session/manager.py::get_history`.
|
||||||
- **`idleCompactAfterMinutes: 0` na `nanobot.hell` — auto-compact (`AutoCompact`) je VYPNUTÝ.** Default v schématu je 15 min; tady je natvrdo 0, takže `check_expired()` (`agent/loop.py`, volané na 1s timeoutu hlavní smyčky) nikdy nic nekomprimuje na 8 zpráv + summary.
|
- **`idleCompactAfterMinutes: 0` na `nanobot.hell` — auto-compact (`AutoCompact`) je VYPNUTÝ.** Default v schématu je 15 min; tady je natvrdo 0, takže `check_expired()` (`agent/loop.py`, volané na 1s timeoutu hlavní smyčky) nikdy nic nekomprimuje na 8 zpráv + summary.
|
||||||
- I kdyby zapnutý byl: **periodický cron job v té session drží `session.updated_at` čerstvý** → session nikdy nevypadá jako idle → auto-compact by se pro ni stejně nikdy nespustil. Recurring cron bound na chat tedy fakticky blokuje auto-compact té session, i kdyby byl jinde v config zapnutý.
|
- I kdyby zapnutý byl: **periodický cron job v té session drží `session.updated_at` čerstvý** → session nikdy nevypadá jako idle → auto-compact by se pro ni stejně nikdy nespustil. Recurring cron bound na chat tedy fakticky blokuje auto-compact té session, i kdyby byl jinde v config zapnutý.
|
||||||
- Výsledek: `session.messages` na disku roste bez omezení (jen replay do LLM je capnutý na 120) a nic z toho neprochází konsolidací do `MEMORY.md`/Dream, dokud uživatel neudělá `/new`.
|
- Výsledek: `session.messages` na disku roste bez omezení (jen replay do LLM je capnutý na 120) a nic z toho neprochází konsolidací do `MEMORY.md`/Dream, dokud uživatel neudělá `/new`.
|
||||||
@@ -550,6 +560,30 @@ Daemon notifikuje **jen Telegram** (přes Bot API, deterministicky). Když task
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## Prostředí `exec` toolu — PATH z procesu tam nedosáhne
|
||||||
|
|
||||||
|
`ExecTool._build_env()` (`agent/tools/shell.py`) staví prostředí subprocessu **od nuly**. Na Unixu předá jen `HOME`, `LANG`, `TERM`, `PYTHONUNBUFFERED` (+ cokoli v `tools.exec.allowedEnvKeys`). **`PATH` se z `os.environ` nekopíruje** — na Windows ano, na Unixu ne. Cokoli nastavíš v systemd unitu, `~/.profile` nebo wrapperu, `exec` neuvidí.
|
||||||
|
|
||||||
|
Do 0.2.2 to nevadilo, protože `exec` běžel jako **login shell** (`bash -lc`) a ten sourcoval `~/.profile` s `PATH="$HOME/.local/bin:$PATH"`. Upstream commit `13c951aa` (25. 6. 2026) přepnul default `login` na `False` — kvůli secrets, které se profilem vracely zpátky do prostředí. Bez login shellu se PATH dopočítá z **vestavěného defaultu bashe**:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
|
||||||
|
```
|
||||||
|
|
||||||
|
`~/.local/bin` tam není → `uv: command not found`, exit 127.
|
||||||
|
|
||||||
|
**Jediná správná cesta je `tools.exec.pathPrepend` / `pathAppend` v `config.json`.** Hodnota musí být **adresář**, ne cesta k binárce — `/home/nanobot/.local/bin/uv` do PATH lookupu nepřispívá ničím. Implementace: `_wrap_path_export()` předřadí příkazu `export PATH="$NANOBOT_PATH_PREPEND:$PATH"; …`.
|
||||||
|
|
||||||
|
**Preferuj `pathPrepend`.** Default bashe končí `.` (aktuální adresář) a `exec` běží s CWD = workspace root, do kterého zapisuje agent i Dream — s `pathAppend` by `.` bylo v pořadí **před** našimi cestami.
|
||||||
|
|
||||||
|
**Není hot-reload.** Config watcher volá `agent.invalidate_runtime_config()` (`agent/loop.py:516`), což invaliduje jen model-runtime resolver; `ExecTool.create(ctx)` běží jednou při startu gateway. Po změně `tools.exec.*` je nutný `systemctl --user restart nanobot`.
|
||||||
|
|
||||||
|
**Protiváha — PATH procesu inertní není.** `run_cli_app` spouští CLI aplikace s `env=os.environ.copy()` (`apps/cli/service.py:1372`) a MCP stdio servery dědí taky. Proto `Environment=PATH=` v systemd unitu zůstává — jen neřeší `exec`.
|
||||||
|
|
||||||
|
Zdroj: `agent/tools/shell.py` (`_build_env`, `_wrap_path_export`, `_prepare_command`), upstream commit `13c951aa`. Diagnóza a oprava: history 2026-08-01.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Skill `exec` běží z workspace rootu, ne ze skill adresáře
|
## Skill `exec` běží z workspace rootu, ne ze skill adresáře
|
||||||
|
|
||||||
Když skill volá `exec` bez explicitního `working_dir`, příkaz běží s **CWD = workspace root** (`~/.nanobot/workspace`), **ne** v adresáři skillu. Cesty na skripty skillu proto musí být buď workspace-relativní (`skills/<name>/scripts/x.py`) nebo absolutní — **skill-dir-relativní `scripts/x.py` se rozbije** (resolvuje na `workspace/scripts/x.py`).
|
Když skill volá `exec` bez explicitního `working_dir`, příkaz běží s **CWD = workspace root** (`~/.nanobot/workspace`), **ne** v adresáři skillu. Cesty na skripty skillu proto musí být buď workspace-relativní (`skills/<name>/scripts/x.py`) nebo absolutní — **skill-dir-relativní `scripts/x.py` se rozbije** (resolvuje na `workspace/scripts/x.py`).
|
||||||
@@ -655,7 +689,7 @@ On-demand skill pro okamžitou explicitní paměť. Uživatel řekne „keep X"
|
|||||||
|
|
||||||
**Ukládá i *why*, ne jen *what* (od 2026-06-06):** Krok 2 Write protokolu rozlišuje typ záznamu — plain fakt (alergie, deploy window, jméno) jde bez důvodu; **rozhodnutí / preference / dead-end** dostane důvod inline na stejném řádku (`<fakt> — because <terse why>`). Pokud je vstup rozhodnutí/dead-end *bez* uvedeného důvodu, model se **jednou doptá** na why (decline/self-evident → uloží bez něj). Záměrně úzká varianta Claude memory.md vzoru, který why přidává jen u feedback/project, ne u reference/faktu. Žádné `Why:` bloky ani few-shot příklady — silné Ollama Cloud / OpenRouter modely zvládnou hranici fakt-vs-rozhodnutí zero-shot. Plný kontext: history.md 2026-06-06.
|
**Ukládá i *why*, ne jen *what* (od 2026-06-06):** Krok 2 Write protokolu rozlišuje typ záznamu — plain fakt (alergie, deploy window, jméno) jde bez důvodu; **rozhodnutí / preference / dead-end** dostane důvod inline na stejném řádku (`<fakt> — because <terse why>`). Pokud je vstup rozhodnutí/dead-end *bez* uvedeného důvodu, model se **jednou doptá** na why (decline/self-evident → uloží bez něj). Záměrně úzká varianta Claude memory.md vzoru, který why přidává jen u feedback/project, ne u reference/faktu. Žádné `Why:` bloky ani few-shot příklady — silné Ollama Cloud / OpenRouter modely zvládnou hranici fakt-vs-rozhodnutí zero-shot. Plný kontext: history.md 2026-06-06.
|
||||||
|
|
||||||
**Gotcha — BOOTSTRAP_FILES jsou hardcoded:** `nanobot/agent/context.py:25` má `BOOTSTRAP_FILES = ["AGENTS.md", "SOUL.md", "USER.md", "TOOLS.md"]` — nelze přidat vlastní soubor bez patche. Vše, co má být vidět každý tah bez on-demand loadingu, musí být reference v existujícím bootstrap souboru (USER.md, SOUL.md, …).
|
**Gotcha — BOOTSTRAP_FILES jsou hardcoded:** `nanobot/agent/context.py:57` má `BOOTSTRAP_FILES = ["AGENTS.md", "SOUL.md", "USER.md"]` (do 0.2.x i `TOOLS.md`) — nelze přidat vlastní soubor bez patche. Vše, co má být vidět každý tah bez on-demand loadingu, musí být reference v existujícím bootstrap souboru (USER.md, SOUL.md, …).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -671,7 +705,7 @@ Přepsáno z SQLite row-store na **capture → compile pipeline** (vzor llm-wiki
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Skill `/project` — pojmenované dlouhodobé pracovní kontexty (přepsáno 2026-07-22)
|
## Skill `/project` — pojmenované dlouhodobé pracovní kontexty (přepsáno 2026-07-22, skript 2026-09-02)
|
||||||
|
|
||||||
Substituce Claude.ai "Projects". Adresář na projekt, ne jeden soubor: `workspace/projects/<slug>/{prompt.md, memory.md, state.md, artifacts/}`. `prompt.md` = kontext/instrukce čtené při aktivaci; `memory.md` = append-only chronologická historie/rozhodnutí; `state.md` = **živý** dokument (přepisuje se na místě, syntéza "kde to teď je" — ne deník); `artifacts/` = generované soubory bez zvláštní evidence.
|
Substituce Claude.ai "Projects". Adresář na projekt, ne jeden soubor: `workspace/projects/<slug>/{prompt.md, memory.md, state.md, artifacts/}`. `prompt.md` = kontext/instrukce čtené při aktivaci; `memory.md` = append-only chronologická historie/rozhodnutí; `state.md` = **živý** dokument (přepisuje se na místě, syntéza "kde to teď je" — ne deník); `artifacts/` = generované soubory bez zvláštní evidence.
|
||||||
|
|
||||||
@@ -679,6 +713,10 @@ Substituce Claude.ai "Projects". Adresář na projekt, ne jeden soubor: `workspa
|
|||||||
|
|
||||||
**Nahradil netrackovaný server-side skill** (existoval na serveru mimo tento repo, žádná zmínka v history/knowledge/decisions před tímto datem): plochý soubor `projects/<slug>.md` s frontmatterem `status`/`priority`/`created`, CLI backend (`scripts/project.py`: add/list/show/status), `switch` ukládal aktivní projekt do `my` scratchpad nástroje (viz níže). Reálná data (`projects/radio-1.md`, projekt na stříhání audio streamu Radia 1, 2026-06-09) přemigrována do nového formátu jako `projects/radio1/`. Plná historie: history.md 2026-07-22.
|
**Nahradil netrackovaný server-side skill** (existoval na serveru mimo tento repo, žádná zmínka v history/knowledge/decisions před tímto datem): plochý soubor `projects/<slug>.md` s frontmatterem `status`/`priority`/`created`, CLI backend (`scripts/project.py`: add/list/show/status), `switch` ukládal aktivní projekt do `my` scratchpad nástroje (viz níže). Reálná data (`projects/radio-1.md`, projekt na stříhání audio streamu Radia 1, 2026-06-09) přemigrována do nového formátu jako `projects/radio1/`. Plná historie: history.md 2026-07-22.
|
||||||
|
|
||||||
|
**Zápis do `memory.md` jde výhradně přes `skills/project/scripts/project_cli.py log`** (od 2026-09-02). Subcommandy `activate` / `log` / `list` / `new`; volat workspace-relativně `uv run skills/project/scripts/project_cli.py …`. Skript vlastní datum (systémové hodiny, Europe/Prague) a koncový newline — obojí model prokazatelně kazil: `chata/memory.md` měl dva záznamy s vymyšleným datem `2026-09-14` (zapsané 09-01) a `proxmox/memory.md` slepený append na předchozím řádku, protože `edit_file` kotva se hádala bez přečtení souboru. Text se předává **stdin quoted heredocem** (`<<'NOTE'`), ne `--text` — shell obsah neinterpretuje, takže `„"`, `'` i `"` projdou doslova (v `log/note.log` je doložený případ, kdy model `--text` argument zmršil na `...`). Stav skriptu přepisuje env `PROJECTS_DIR` (testy). Plný kontext: history.md 2026-09-02.
|
||||||
|
|
||||||
|
**Projektová data nemají strop ani konsolidaci** — `memory.md` roste neomezeně a nikdy se nekomprimuje ani nearchivuje. Velikost se řeší **výhradně na straně čtení**: `activate` nad limitem tool výsledku vypustí z výstupu nejstarší záznamy a ukáže cestu k plnému logu, soubor na disku nechá beze změny. Zamítnutá varianta: prahy 8 000 / 12 000 znaků s nabídkou konsolidace — ztráta zadaného obsahu je horší failure mode než jakákoli úspora kontextu (a čísla stála na špatném okně, viz níže).
|
||||||
|
|
||||||
## `my` nástroj — přece jen nějaký perzistentní scratchpad existuje
|
## `my` nástroj — přece jen nějaký perzistentní scratchpad existuje
|
||||||
|
|
||||||
Zjištěno 2026-07-22 při objevu starého `/project` skillu výše: ten používal `my(action="set", key="project_context", value="<slug>")` k uložení aktivního projektu (a zjevně `action="get"` k přečtení). To je v napětí s dřívějším závěrem [[Bound cron job sdílí session s chatem]] výše, že nanobot nemá žádný session-scoped state kromě historie zpráv — `my` je zjevně nějaká forma key-value scratchpadu dostupná agentovi jako tool.
|
Zjištěno 2026-07-22 při objevu starého `/project` skillu výše: ten používal `my(action="set", key="project_context", value="<slug>")` k uložení aktivního projektu (a zjevně `action="get"` k přečtení). To je v napětí s dřívějším závěrem [[Bound cron job sdílí session s chatem]] výše, že nanobot nemá žádný session-scoped state kromě historie zpráv — `my` je zjevně nějaká forma key-value scratchpadu dostupná agentovi jako tool.
|
||||||
@@ -722,6 +760,8 @@ Nanobot má **hardcoded default `context_window_tokens = 65_536`** pro `ModelPre
|
|||||||
|
|
||||||
Nastaveno 2026-06-02 per-preset na reálné limity modelů (kimi-k2.6 / qwen3.5 / nemotron-3-super 262144, minimax-m2.7 204800, glm-5.1 196608, deepseek-v4-flash 1048576) + `maxTokens` 16384. **Bez restartu** — `modelPresets` se hot-reloadují (viz sekce „Kdy je a není potřeba restart"). U `:cloud` modelů hostí kontext Ollama cloud, takže `contextWindowTokens` reálně rozšíří budget — není to lokální `num_ctx` žeroucí RAM. Plný záznam: history 2026-06-02.
|
Nastaveno 2026-06-02 per-preset na reálné limity modelů (kimi-k2.6 / qwen3.5 / nemotron-3-super 262144, minimax-m2.7 204800, glm-5.1 196608, deepseek-v4-flash 1048576) + `maxTokens` 16384. **Bez restartu** — `modelPresets` se hot-reloadují (viz sekce „Kdy je a není potřeba restart"). U `:cloud` modelů hostí kontext Ollama cloud, takže `contextWindowTokens` reálně rozšíří budget — není to lokální `num_ctx` žeroucí RAM. Plný záznam: history 2026-06-02.
|
||||||
|
|
||||||
|
**Gotcha — `agents.defaults.contextWindowTokens` je zavádějící číslo.** V serverovém `config.json` je `65536`, ale to platí jen když preset vlastní hodnotu nemá. Reálné okno aktuálního defaultu (**`glm53`: 976 000**, `glm52`/`glm-flash` 976 000, `kimi3` 1 020 000, `sonnet`/`gemini-flash` 256 000) je ~15× větší, než `defaults` napovídá. **Než z 65k něco odvodíš, přečti `model_presets`, ne `agents.defaults`** — na tomhle jsem 2026-09-02 postavil celý (zamítnutý) rozpočet velikosti pro `/project`. Limit, který v praxi kouše, je `maxToolResultChars: 16000`, ne okno.
|
||||||
|
|
||||||
**Důsledky (trade-off, ne čistá výhra):**
|
**Důsledky (trade-off, ne čistá výhra):**
|
||||||
|
|
||||||
- **+** Méně ořezávání/komprese historie → lepší návaznost v dlouhých sezeních. Delší souvislé odpovědi (16k vs 8k output).
|
- **+** Méně ořezávání/komprese historie → lepší návaznost v dlouhých sezeních. Delší souvislé odpovědi (16k vs 8k output).
|
||||||
@@ -912,3 +952,196 @@ K tomu už dřív známé: tool-result bug + výrazná pomalost. **Zkouší se n
|
|||||||
**Problém → příčina → fix:** Modely (kimi27 i default) po `/remind list` dostanou kompletní tabulku (CLI exit 0), ale jeden ji scvrkne na počet, druhý si ji přerenderuje po svém. → Příčina: `SKILL.md` sekce `## Behavioral contract` *popisovala formát* výstupu, ale neříkala „předej kompletní" — modely to čtou jako surová data k vlastnímu formátování. → Fix: odstavec **Showing read results** (`list`/`upcoming`/`delivered` = user-ready text, vypsat každou položku s `#display-id`, nesumarizovat). Plný záznam: history 2026-06-15 13:21.
|
**Problém → příčina → fix:** Modely (kimi27 i default) po `/remind list` dostanou kompletní tabulku (CLI exit 0), ale jeden ji scvrkne na počet, druhý si ji přerenderuje po svém. → Příčina: `SKILL.md` sekce `## Behavioral contract` *popisovala formát* výstupu, ale neříkala „předej kompletní" — modely to čtou jako surová data k vlastnímu formátování. → Fix: odstavec **Showing read results** (`list`/`upcoming`/`delivered` = user-ready text, vypsat každou položku s `#display-id`, nesumarizovat). Plný záznam: history 2026-06-15 13:21.
|
||||||
|
|
||||||
**Diagnostika chování nanobot agenta = číst webui session logy.** Konverzace (user/assistant/tool turny, včetně `reasoning_content` a `exec` výstupů) žijí na serveru ve `workspace/sessions/websocket_<id>.jsonl` (kopie i v `~/.nanobot/webui/`). Pro „proč model udělal X" stáhnout příslušnou session a číst turny — odhalí, že příkaz uspěl a chyba je až v prezentaci.
|
**Diagnostika chování nanobot agenta = číst webui session logy.** Konverzace (user/assistant/tool turny, včetně `reasoning_content` a `exec` výstupů) žijí na serveru ve `workspace/sessions/websocket_<id>.jsonl` (kopie i v `~/.nanobot/webui/`). Pro „proč model udělal X" stáhnout příslušnou session a číst turny — odhalí, že příkaz uspěl a chyba je až v prezentaci.
|
||||||
|
|
||||||
|
## Session logy: 89 % objemu jsou tool výsledky
|
||||||
|
|
||||||
|
Z 534 souborů v `~/.nanobot/workspace/sessions/` je 332 reálných konverzací (12 311 zpráv, 14,1 MB obsahu). **12,5 MB (89 %) tvoří návratové hodnoty toolů** — už oříznuté na `maxToolResultChars: 16000`. Pro analýzu chování stačí nahradit je metadaty (`name(args) → ok|ERROR, velikost`), čímž korpus spadne na ~3 MB. Přírůstek je 4,4 session/den, aktivita jen 70 % dní. Zdroj: měření 2026-09-01, `skills/reflect/scripts/reflect_distill.py`.
|
||||||
|
|
||||||
|
## `reflect`: nálezy platí pro okno, ne pro celou historii (2026-09-02)
|
||||||
|
|
||||||
|
Dokud běh dohání backlog chronologicky, nálezy popisují **nejstarší** nezpracované session,
|
||||||
|
i když je předkládá jako aktuální. Reálně: 3 běhy zpracovaly 56 z 356 session, všechny
|
||||||
|
z 26.–29. 5., a všech 8 rozhodnutých nálezů (4 aplikované do `SOUL.md`) tak opravovalo
|
||||||
|
chování z konce května. Fix: `since = max(cursor, now - window)` — cursor je **podlaha**
|
||||||
|
(nic dvakrát, jinak `merge_findings` sečte počty znovu), okno **strop** (starší session se
|
||||||
|
přeskočí natrvalo). Default `--window-days 21`. Plný záznam: [history.md](history.md) 2026-09-02.
|
||||||
|
|
||||||
|
Dávkování samo nálezy nezkreslovalo — každý z těch tří běhů byl jedna dávka.
|
||||||
|
|
||||||
|
## `reflect`: destilát session vyrostl z ~5 kB na ~14 kB (měřeno 2026-09-02)
|
||||||
|
|
||||||
|
21denní okno = 74 session = **6 dávek** po 200 kB (~1 MB destilátu). Původní plán počítal
|
||||||
|
s ~4,4 session/den po ~5 kB, tedy jednou dávkou. Důsledek: `--deadline-minutes 20` +
|
||||||
|
`TIMEOUT_SECONDS 45 min` zvládnou 1–2 dávky za noc, takže okno se dohání ~2,4 dne za noc.
|
||||||
|
Při dimenzování dávkovaného běhu nad session logy je tedy nutné velikost **měřit**
|
||||||
|
(`reflect_distill.py --stats`), ne odvozovat z počtu session.
|
||||||
|
|
||||||
|
## `reflect`: počty v nálezu jsou self-report modelu, ne měření
|
||||||
|
|
||||||
|
`occurrences` / `sessions_affected` si vymýšlí analyzující LLM a `merge_findings` je jen
|
||||||
|
sčítá napříč běhy. Nekoherenci to propustilo do store: nález `f09a7` měl `occurrences: 4`
|
||||||
|
a `sessions_affected: 5`. Skript umí zkontrolovat jen invarianty
|
||||||
|
(`sessions_affected ≤ min(occurrences, počet session v dávce)`, clamp ve validátoru) —
|
||||||
|
absolutní hodnota zůstává nedokázaná a v review se nesmí prezentovat jako měření.
|
||||||
|
|
||||||
|
## `reflect`: dávkovaná analýza nevidí rozptýlené vzory
|
||||||
|
|
||||||
|
Prompt zakazoval hlásit jednorázový slip, takže vzor s frekvencí ~1× na dávku se nikdy
|
||||||
|
nepojmenoval → nikdy nespočítal → práh `≥2 výskyty a ≥2 session` nepřelezl. Práh sám
|
||||||
|
skládání napříč dávkami zvládá; chyběl mu vstup. Fix: prompt smí hlásit jediný výskyt
|
||||||
|
vzoru, který **už je v „Known patterns"**, a dostal informaci, že vidí jen výsek historie.
|
||||||
|
Novost vzoru se tím nemění — genuinely nový singleton se pořád nehlásí.
|
||||||
|
|
||||||
|
## `reflect`: zápis do auditního store patří výhradně skriptu
|
||||||
|
|
||||||
|
`SKILL.md` říkal agentovi, aby u nálezu bez patche „propose the exact old_text/new_text
|
||||||
|
yourself", ale `reflect_apply.py` patch přijmout neuměl (`--new-text-file` jen přepíše
|
||||||
|
`new_text` **už existujícího** patche). Agentovi nezbylo než editovat `findings.jsonl`
|
||||||
|
ad-hoc skriptem — session `7a988478` na to spotřebovala 3 jednorázové skripty. Fix
|
||||||
|
(2026-09-02): akce `--set-patch <json>`, která kandidáta nejdřív prožene `check_patch()`
|
||||||
|
a **teprve pak** zapíše, plus věta ve STOP gate 4, že se store needituje ručně nikdy.
|
||||||
|
Poučení obecně: dokud pro nějaký legitimní krok neexistuje volání skriptu, prompt ho
|
||||||
|
nezakáže — agent si cestu najde a bude mít pravdu.
|
||||||
|
|
||||||
|
## `reflect`: „naposledy" u nálezu byl dřív datum přepsání záznamu
|
||||||
|
|
||||||
|
`_seen_line()` vydávalo `created` (kdy se záznam naposledy složil) za „last seen", takže
|
||||||
|
nález refilovaný každou noc hlásil dnešek bez ohledu na stáří důkazů. Ze stejného zdroje
|
||||||
|
plynuly falešné regrese: `regression_of` se nastavilo, kdykoli se vzor po `applied` objevil,
|
||||||
|
i když analyzovaná session byla z doby **před** opravou (`retry-without-diagnosis` 67×
|
||||||
|
označen REGRESE, nejnovější důkaz 31. 8., patch 1. 9.). Fix (2026-09-02): derivované pole
|
||||||
|
`last_seen` = `max(evidence[].when)` (jen tvary `^\d{4}-\d{2}-\d{2}`, prvních 10 znaků,
|
||||||
|
fallback `created`) — a `regression_of` jen když `last_seen > applied.at[:10]`, jinak `watch`.
|
||||||
|
`when` je volný string od modelu a formáty se míchají (`2026-08-31` i `2026-08-31 13:53`).
|
||||||
|
|
||||||
|
## `reflect`: report počítal nálezy po dávkách, ne po vzorech
|
||||||
|
|
||||||
|
`_run()` dělalo `merged += batch_findings`, takže vzor nalezený v 5 dávkách byl v `merged`
|
||||||
|
5× — včetně mezistavů, které fold zahodil. Z toho žil report, `stats` i Telegram: report
|
||||||
|
z 2. 9. měl **29 nadpisů proti 13 vzorům ve store**. Fix (2026-09-02): `merged` je
|
||||||
|
`dict[str, Finding]` klíčovaný `pattern`, poslední zápis (nejvíc složený) vyhrává.
|
||||||
|
Store byl správně po celou dobu — nafouknutá byla jen prezentace.
|
||||||
|
|
||||||
|
## Vyřešené chyby ve skillu `reflect` (2026-09-02) — noční běh nedobíhal
|
||||||
|
|
||||||
|
Noční cron padal na 30min timeout a zahazoval i to, co už měl hotové:
|
||||||
|
|
||||||
|
- **All-or-nothing zápis** → `_write_findings`, kurzor i report se dělaly po poslední dávce,
|
||||||
|
takže timeout zahodil dvě dávky s platnými nálezy a kurzor nechal na místě → další noc totéž
|
||||||
|
plus nové session → fix: `commit()` po **každé** dávce, kurzor se nikdy nepohne dozadu.
|
||||||
|
- **Žádný strop na délku běhu** → 412 session za kurzorem = 7 dávek ≈ 90 min proti 30 min
|
||||||
|
→ fix: soft deadline `--deadline-minutes` (default 20), `TIMEOUT_SECONDS` 45 min už jen jako
|
||||||
|
brzda na zaseknutou dávku.
|
||||||
|
- **185k-tokenový prompt přetékal provider timeout** (`_OPENAI_COMPAT_REQUEST_TIMEOUT_S` = 120 s,
|
||||||
|
`NANOBOT_LLM_TIMEOUT_S` = 300 s), retry zahodí hotový prefill a začne znovu → 9 timeoutů za běh
|
||||||
|
→ fix: `os.environ.setdefault` na 600/900 s + dávka 500 kB → 200 kB (~70 k tokenů).
|
||||||
|
- **Infra chyba šla do JSON validátoru** → nanobot vrací `Error calling LLM: …` jako odpověď
|
||||||
|
agenta, validátor to hlásil jako „invalid JSON" a spotřeboval 1 ze 3 pokusů, model dostal
|
||||||
|
vytýkáno něco, co nenapsal → fix: `RunResult.stop_reason == "error"` se pozná dřív, přepošle
|
||||||
|
se **původní** prompt v čerstvé session, vlastní strop 2 pokusy.
|
||||||
|
|
||||||
|
Efekt: dávka z ~13 min na **147 s**, jedna iterace, žádný retry. Plný záznam:
|
||||||
|
[history.md](history.md) 2026-09-02.
|
||||||
|
|
||||||
|
## `RunResult` z `Nanobot.run()` rozlišuje selhání providera
|
||||||
|
|
||||||
|
`nanobot/sdk/types.py:50` — `RunResult` má `stop_reason` a `error`. Když LLM call selže, nanobot
|
||||||
|
vrátí text chyby jako **obsah odpovědi** (`Error calling LLM: timed out after 300s`) a zároveň
|
||||||
|
nastaví `stop_reason="error"` + `error` (`agent/runner.py:289-305`, `agent/loop.py:1019`).
|
||||||
|
Skript, který parsuje odpověď agenta, musí tenhle stav testovat **před** validací — jinak
|
||||||
|
diagnostikuje infra výpadek jako vadný výstup modelu.
|
||||||
|
|
||||||
|
## Timeouty LLM callu v nanobotu: 120 s na request, 300 s na celý call
|
||||||
|
|
||||||
|
Dvě vrstvy, obě přebitelné env proměnnou:
|
||||||
|
|
||||||
|
| Vrstva | Default | Env | Zdroj |
|
||||||
|
|---|---|---|---|
|
||||||
|
| jeden HTTP request na OpenAI-kompatibilní endpoint | **120 s** | `NANOBOT_OPENAI_COMPAT_TIMEOUT_S` | `providers/openai_compat_provider.py:89,163` |
|
||||||
|
| celý call včetně retry (3 pokusy) | **300 s** (0 = vypnuto) | `NANOBOT_LLM_TIMEOUT_S` | `agent/runner.py:702` |
|
||||||
|
| idle mezi chunky ve streamu | 90 s | `NANOBOT_STREAM_IDLE_TIMEOUT_S` | `providers/base.py:20` |
|
||||||
|
|
||||||
|
SDK cesta (`Nanobot.run()`) **nestreamuje** (`stream: False`), takže idle timeout se jí netýká.
|
||||||
|
Retry počítá prefill znovu od nuly — u desítek tisíc tokenů promptu je tedy dražší než čekání,
|
||||||
|
proto se u dávkových skriptů vyplatí request timeout zvednout, ne zkracovat.
|
||||||
|
|
||||||
|
## `reflect`: `--new-text-file` bez `--check` aplikuje okamžitě (2026-09-02)
|
||||||
|
|
||||||
|
`reflect_apply.py --new-text-file <path>` **není náhled** — bez `--check` jde přímo do
|
||||||
|
`apply_finding()`, tedy zápis souboru + commit. Náhled uživatelovy editace je až
|
||||||
|
`--check --new-text-file`, a protože se jeho text do `patch` neukládá, musí temp soubor
|
||||||
|
přežít do aplikace a předat se znovu. `SKILL.md` to mělo v tabulce rozhodnutí zaměněné
|
||||||
|
(řádek `edit:` sliboval diff, předepisoval aplikaci) — opraveno, viz history 2026-09-02 14:55.
|
||||||
|
|
||||||
|
## Vyřešené chyby ve skillu `reflect` (2026-09-01)
|
||||||
|
|
||||||
|
Čtyři tiché chyby — nic nespadlo, jen se dělo něco jiného, než co slibovala dokumentace:
|
||||||
|
|
||||||
|
- **Kurzor nefiltroval** → `_run` ukládal zformátovaný stamp (`2026-07-11 14:02`), `collect_sessions`
|
||||||
|
ho porovnávala proti syrovému ISO (`…T09:00:…`); `'T'` > `' '`, takže 9 session z dne kurzoru se
|
||||||
|
analyzovalo znovu každý běh a výskyty se počítaly dvakrát → fix: `SessionDigest.started` drží syrové
|
||||||
|
ISO, formátuje se až v hlavičce.
|
||||||
|
- **Zamítnutí vydrželo jen jeden běh** → `merge_findings` brala `previous` jako záznam s nejnovějším
|
||||||
|
`created`, takže `watch` záznam založený po zamítnutí přebil `rejected` → fix: zamítnutí je vlastnost
|
||||||
|
vzoru (set přes všechny záznamy), ne posledního záznamu. Stejná příčina ztrácela `regression_of`.
|
||||||
|
- **`reflect_apply.py` hlásil „refused" po zápisu** → soubor se přepisoval před commitem, selhání
|
||||||
|
`git commit` vrátilo exit 2 se změněným souborem → fix: rollback na původní obsah, který
|
||||||
|
`check_patch` už vracel.
|
||||||
|
- **Validátor zahazoval celou dávku** kvůli neznámému klíči nebo o 10 znaků delší diagnóze → retry
|
||||||
|
přeposílal ~420k tokenů → fix: retry jen při neparsovatelném JSON nebo když nepřežil ani jeden nález.
|
||||||
|
|
||||||
|
Plný záznam: [history.md](history.md) 2026-09-01.
|
||||||
|
|
||||||
|
## Test může projít kolem chyby, když si vstup vyrobí v jiném formátu než volající
|
||||||
|
|
||||||
|
`test_since_excludes_already_processed_sessions` podával `since` jako `"2026-08-01T00:00:00"` — formát,
|
||||||
|
který produkční kód nikdy nevyrobí (ukládal `"2026-08-01 00:00"`). Test byl zelený a chyba běžela
|
||||||
|
v produkci. **U hodnot, které jedna část kódu zapisuje a druhá čte, testuj round-trip, ne literál.**
|
||||||
|
Zdroj: `skills/reflect/tests/test_reflect_distill.py`, history 2026-09-01.
|
||||||
|
|
||||||
|
## Tokenizace nanobot korpusu: ~1,2 znaku na token
|
||||||
|
|
||||||
|
Naměřeno na reálném destilátu (90 kB promptu → 75 135 tokenů podle tiktoken v `nanobot.agent.memory`). Čeština, názvy toolů a UUID se tokenizují špatně. **Odhad „3–4 znaky na token" je pro tenhle korpus 3× mimo** — kdo počítá velikost dávky, musí použít 1,2.
|
||||||
|
|
||||||
|
## `contextWindowTokens` presetu přebíjí `agents.defaults`
|
||||||
|
|
||||||
|
`agents.defaults.contextWindowTokens` je 65536, ale preset `glm53` má 976000 a **vyhrává** — `agent/loop.py:476` (`context_window_tokens = extra.pop(...) or resolved.context_window_tokens`). Efektivní input budget = `contextWindowTokens - maxTokens - 1024` (`SNIP_SAFETY_BUFFER`, `agent/context_governance.py:105`), tedy ~958k tokenů pro glm53.
|
||||||
|
|
||||||
|
## Velká zpráva projde, `snip_history` krátí jen historii
|
||||||
|
|
||||||
|
`ContextGovernor.snip_history` (`agent/context_governance.py:383`) zahazuje **celé starší zprávy**, nikdy nekrátí jednu zprávu — a nejnovější zprávu přidá vždy, i když sama překročí budget (`if kept and kept_tokens + msg_tokens > remaining_budget: break`, řádek 422). Velký vstup je proto lepší poslat **přímo ve zprávě** než souborem přes `read_file`, který by ho uřízl na `maxToolResultChars` (16 000 znaků).
|
||||||
|
|
||||||
|
## `uv` není v PATH neinteraktivního SSH
|
||||||
|
|
||||||
|
`ssh nanobot@nanobot.hell 'uv run …'` skončí `failed to run command 'uv': No such file or directory`. Je v `/home/nanobot/.local/bin/uv` — přes SSH je nutná plná cesta. **Crontab si `PATH` nastavuje sám** (`PATH=/home/nanobot/.local/bin:/usr/bin:/bin`), tam bare `uv run` funguje. Souvisí s `tools.exec.pathPrepend` (history 2026-08-01).
|
||||||
|
|
||||||
|
## LLM rozbíjí JSON českou uvozovkou — a hláška o tom musí být konkrétní
|
||||||
|
|
||||||
|
GLM-5.3 při psaní české diagnózy do JSON stringu napsal `(„repeated external lookup blocked")`: otevírací uvozovka je `„` (U+201E), ale **zavírací je ASCII `"`**, která neescapovaná ukončí string. Generická hláška „no parseable json block" nedá retry nic použitelného a všechny 3 pokusy selžou stejně. Fix: validátor hlásí `msg`, řádek, sloupec a výřez textu okolo `error.pos`, plus prompt zakazuje uvozovky uvnitř string hodnot. Po opravě prošel první pokus. Zdroj: `skills/reflect/scripts/reflect_auto.py:_decode_payload`, history 2026-09-01.
|
||||||
|
|
||||||
|
## `~/.nanobot/workspace` je git repo a nanobot do něj commituje sám
|
||||||
|
|
||||||
|
Lokální repo **bez remote**; 15 z posledních 20 commitů je `nanobot <nanobot@dream>` (Dream dělá `dream: periodic memory consolidation`). `.gitignore` vynechává `db/ sessions/ log/ tmp/ backup/ tasks/ cron/runs/`. Důsledek: skill, který mění soubory na serveru, nepotřebuje vlastní zálohy — commit před změnou a `git revert` stačí. Pozor: **není to záloha mimo stroj** a je to repo nespojené s `src/nanobot`.
|
||||||
|
|
||||||
|
## Stav skillu nesmí bydlet v adresáři skillu
|
||||||
|
|
||||||
|
`rsync -av skills/<name>/ …` přepisuje celý adresář, takže `state.json` nebo databáze uvnitř `skills/<name>/` se při nasazení ztratí. Data patří do vlastního adresáře v rootu workspace — vzor `skills/note/` + `notes/`, nově `skills/reflect/` + `reflect/`.
|
||||||
|
|
||||||
|
## `reflect`: odhad šance opravy stojí na tom, jestli je text v kontextu (2026-09-02)
|
||||||
|
|
||||||
|
`/reflect` ukazuje u nálezu odhad `~80 / ~60 / ~40 / ~20 %`, že oprava vzor skutečně
|
||||||
|
zastaví. Hlavní osa rubriky není kvalita formulace, ale **jestli je opravovaný text
|
||||||
|
v kontextu ve chvíli, kdy chyba vzniká**: gate ve skriptu drží vždy (~80 %), tvrdý zákaz
|
||||||
|
v `SOUL.md`/`AGENTS.md`/`SKILL.md` dotčeného skillu ~60 %, přeformulování tamtéž ~40 %,
|
||||||
|
soubor mimo kontext nebo ponechání na úvaze agenta ~20 %. `regression_of` sráží o pásmo —
|
||||||
|
instrukce toho druhu už na tom vzoru jednou selhala. Pásma, ne přesná čísla: je to odhad
|
||||||
|
ze záznamu, ne měření. Zdroj: `skills/reflect/SKILL.md` sekce „Estimating the odds",
|
||||||
|
history 2026-09-02.
|
||||||
|
|
||||||
|
## `reflect`: `--workspace` umožní zkoušet zásahy mimo ostrý store (2026-09-02)
|
||||||
|
|
||||||
|
`reflect_apply.py --workspace <cesta>` bere kompletní workspace odjinud, takže se dá
|
||||||
|
`--set-patch`/`--check`/`--apply` vyzkoušet na kopii (`findings.jsonl` + cílový soubor
|
||||||
|
v `tmp/`) a ostrý store i cílový soubor zůstanou nedotčené. Použito při ověření draftování
|
||||||
|
patche na reálném nálezu `f5c34`. Zdroj: `skills/reflect/scripts/reflect_apply.py:250`,
|
||||||
|
history 2026-09-02.
|
||||||
|
|||||||
@@ -1,161 +1,114 @@
|
|||||||
# Modely — fakta a naměřené hodnoty
|
# Modely — fakta a strategie
|
||||||
|
|
||||||
Co je o dostupných modelech ověřeno a změřeno. **Žádná doporučení** — rozhodnutí, co
|
Co je ověřeno o modelech, které používáš. Presety přepínáš v chatu `/model <preset>`;
|
||||||
použít, je na tobě. Mezi presety přepínáš v chatu příkazem `/model <preset>`.
|
trvalá změna defaultu = `agents.defaults.modelPreset` v `~/.nanobot/config.json`.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Nakonfigurované presety (`/model`)
|
## Nakonfigurované presety (`/model`)
|
||||||
|
|
||||||
Zdroj: `~/.nanobot/config.json` → `model_presets` (stav k 2026-06-07). Všechny mají
|
Zdroj: `~/.nanobot/config.json` → `model_presets`. Všechny mají `maxTokens = 16384`,
|
||||||
`maxTokens = 16384`, `temperature = 0.1`.
|
`temperature = 0.1`, `provider = ollama`.
|
||||||
|
|
||||||
| Preset | Provider | Model id | Kontext | Vstup |
|
| Preset | Model id | Kontext | reasoningEffort |
|
||||||
|---|---|---|---|---|
|
|
||||||
| `glm-5.1` *(default)* | ollama (cloud) | `glm-5.1:cloud` | 196 608 | **čistě textový** |
|
|
||||||
| `minimax-m3` | ollama (cloud) | `minimax-m3:cloud` | 1 048 576 | multimodální |
|
|
||||||
| `kimi-k2.6` | ollama (cloud) | `kimi-k2.6:cloud` | 262 144 | multimodální |
|
|
||||||
| `sonnet` | openrouter | `anthropic/claude-sonnet-4.6` | 256 000 | multimodální |
|
|
||||||
| `haiku` | openrouter | `anthropic/claude-haiku-4.5` | 200 000 | multimodální |
|
|
||||||
| `gemini-flash` | gemini | `gemini-3.5-flash` | 256 000 | multimodální |
|
|
||||||
| `gemini-flash-lite` | openrouter | `google/gemini-3.1-flash-lite` | 256 000 | multimodální |
|
|
||||||
|
|
||||||
Multimodalita GLM/M3/Kimi je z porovnání níž (GLM-5.1 nepřijímá obrázky/sken/video);
|
|
||||||
Claude a Gemini přijímají obrázky dle vendor dokumentace.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Rychlost — přímé měření na Ollama Cloud (2026-06-07)
|
|
||||||
|
|
||||||
Měřeno proti Ollamě na `nvidia.hell` (stejný endpoint jako agent), streaming
|
|
||||||
`/api/chat`, identický prompt, 3 běhy/model. `:cloud` modely nevracejí sub-durations,
|
|
||||||
takže tok/s měřeno přes streaming (TTFT = čas 1. content chunku). **Tohle je to, co
|
|
||||||
reálně dostaneš** (na rozdíl od native-class čísel od Artificial Analysis níž).
|
|
||||||
|
|
||||||
| Model | TTFT (medián) | Total wall (medián) | Out tok | End-to-end průtok |
|
|
||||||
|---|---|---|---|---|
|
|
||||||
| `glm-5.1` | ~5,9 s | ~7,5 s | 1200–1730 | **~198 tok/s** |
|
|
||||||
| `minimax-m3` | ~6,8 s | ~10,8 s | 420–460 | **~40 tok/s** |
|
|
||||||
|
|
||||||
`minimax-m3` je o cca **50 % pomalejší v celkové době, i přes 3–4× MÉNĚ vygenerovaných
|
|
||||||
tokenů**. TTFT mají srovnatelný (start není problém). Čistá generace m3 je ~95–120 tok/s
|
|
||||||
(streamuje plynule), ale end-to-end průtok glm je ~5× vyšší. Pozn.: „1300 tok/s" u glm
|
|
||||||
z post-TTFT okna nebrat doslovně — cloud buffer flushne dávku, proto se měří `out/total`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Profil rychlosti a verbozity — Artificial Analysis (nezávislé)
|
|
||||||
|
|
||||||
Native-class profil (na optimální infře, ne na našem Ollama Cloud endpointu — reálnou
|
|
||||||
latenci viz měření výš). Wall-clock per turn ≈ vygenerované tokeny ÷ tok/s, takže
|
|
||||||
verbozita zdržuje stejně jako nízká propustnost.
|
|
||||||
|
|
||||||
| Model | Intelligence Index | Output speed | Verbozita (tok na II) | TTFT | AA verdikt |
|
|
||||||
|---|---|---|---|---|---|
|
|
||||||
| GLM-5.1 | 51 | ~62 t/s | nižší | ~1,6 s | faster than average |
|
|
||||||
| MiniMax M3 | 55 | ~40 t/s | 91M (průměr 29M) | ~2,3–2,5 s | notably slow + very verbose |
|
|
||||||
| Kimi K2.6 | 54 | ~44 t/s | 170M (průměr 43M) | ~2,2–3,0 s | notably slow + very verbose |
|
|
||||||
|
|
||||||
M3 i Kimi sdílejí slow+verbose profil; vyšší Intelligence Index se v interaktivní
|
|
||||||
smyčce může utopit v latenci.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Schopnosti — kde se modely liší (GLM-5.1 vs M3 vs Kimi K2.6)
|
|
||||||
|
|
||||||
Některé rozdíly jsou capability cliff (GLM to neumí vůbec), jiné jen rozdíl míry.
|
|
||||||
|
|
||||||
**Capability cliffs (GLM-5.1 nemá):**
|
|
||||||
|
|
||||||
- **Multimodální vstup** (M3 i Kimi): obrázky, screenshoty, video, naskenované
|
|
||||||
dokumenty. GLM-5.1 je čistě textový.
|
|
||||||
- **Porozumění dokumentům** (M3): OmniDocBench 91,6 % — nejvyšší v porovnání, nad Opus
|
|
||||||
4.7 (89,3 %). *(vendor číslo)*
|
|
||||||
|
|
||||||
**Rozdíl míry (M3/Kimi měřitelně lepší):**
|
|
||||||
|
|
||||||
- **Tvrdé znalosti / expert reasoning** (Kimi): HLE 52,3 % vs GLM 34,7 %.
|
|
||||||
- **Kódování / agentní složitost** (Kimi): kódování ø 72 vs 60,9; agentní ø 73,1 vs
|
|
||||||
65,3. *(BenchLM, semi-nezávislý agregát)*
|
|
||||||
- **Dlouhý kontext v jednom průchodu**: M3 1M, Kimi 256K, GLM 200K.
|
|
||||||
- **Long-horizon agentní stabilita** (Kimi): 4000+ tool callů přes 13 h, swarm až 300
|
|
||||||
sub-agentů.
|
|
||||||
|
|
||||||
**Kde vede GLM-5.1:**
|
|
||||||
|
|
||||||
- **Code Arena Elo 1530** — nezávislý head-to-head signál developer-preference (3. na
|
|
||||||
světě v agentním web devu).
|
|
||||||
- Čistší MIT licence, levnější vstupní cena než Kimi.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Caveaty k číslům
|
|
||||||
|
|
||||||
- **Vendor vs produkce:** Kili Technology zdokumentoval ~37% propad mezi lab benchmark
|
|
||||||
skóre a reálným nasazením. Benchmark měří schopnost, produkce spolehlivost.
|
|
||||||
- **Vendor benchmarky** (SWE-Bench, Terminal-Bench, OmniDocBench…) běží na vlastní infře
|
|
||||||
vendora s jeho scaffoldingem; nejsou napříč vendory přímo srovnatelné. Nejdůvěryhodnější
|
|
||||||
jsou nezávislé: AA Intelligence Index a Code Arena Elo.
|
|
||||||
- **Ollama Cloud:** předplatné povoluje max 3 paralelní dotazy. Žádný rychlý provider
|
|
||||||
(Fireworks/Cerebras/…) k dispozici, takže u ollama presetů platí native-class rychlost.
|
|
||||||
- **Prompt caching** zapíná nanobot jen pro `openrouter`, `anthropic`, `bedrock`. `ollama`
|
|
||||||
a `gemini` cache nedostávají — ollama presety (`glm-5.1`, `minimax-m3`, `kimi-k2.6`)
|
|
||||||
tedy žádné cache breakpointy.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Kontextová okna
|
|
||||||
|
|
||||||
Nanobot má hardcoded default `context_window_tokens = 65 536`; pokud preset hodnotu
|
|
||||||
nepřepíše, jede model na 65k bez ohledu na to, co umí. Presety výš mají nastavené reálné
|
|
||||||
limity. U `:cloud` modelů hostí kontext Ollama cloud (nežere lokální RAM). Vyšší okno
|
|
||||||
znamená méně častou konsolidaci paměti, ale „lost in the middle" propad je výraznější u
|
|
||||||
slabších MoE modelů než u špičkových.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Appendix: měření z MiniLoop (jiný kontext — NE agent presety)
|
|
||||||
|
|
||||||
Tahle čísla jsou ze samostatného `.NET` PoC parseru `/remind add` (text→JSON,
|
|
||||||
`src/MiniLoop/`), ne z agenta. Modely jako `mistral-small` nejsou nakonfigurované jako
|
|
||||||
presety — jsou tu jen jako naměřená fakta. Měřeno 2026-06-03, prompt-only parse, 17 párů.
|
|
||||||
|
|
||||||
**Ollama + OpenRouter, gate=3 na ollama (kvóta 3 paralelní dotazy):**
|
|
||||||
|
|
||||||
| Model | Provider | Úspěšnost | Wall median / avg | Tok in / out |
|
|
||||||
|---|---|---|---|---|
|
|
||||||
| glm-5.1 | ollama | 17/17 | 1690 / 1927 ms | 21118 / 2896 |
|
|
||||||
| deepseek-v4-flash | ollama | 17/17 | 4894 / 6118 ms | 21654 / 3487 |
|
|
||||||
| minimax-m2.7 | ollama | 17/17 | 4815 / 4604 ms | 21969 / 2317 |
|
|
||||||
| claude-haiku-4.5 | openrouter | 16/17* | 1064 / 1135 ms | 23668 / 691 |
|
|
||||||
| gpt-5.4-nano | openrouter | 17/17 | 3034 / 4003 ms | 20987 / 553 |
|
|
||||||
|
|
||||||
**Levné / OSS modely z OpenRouteru** (cena $/M tok in/out):
|
|
||||||
|
|
||||||
| Model | Cena | Úspěšnost | Wall median / avg | out tok |
|
|
||||||
|---|---|---|---|---|
|
|
||||||
| `mistralai/mistral-small-3.2-24b-instruct` | 0.075/0.20 | 17/17 | **934 / 1050 ms** | 610 |
|
|
||||||
| `google/gemma-3-27b-it` | 0.08/0.16 | 17/17 | 1413 / 1611 ms | 608 |
|
|
||||||
| `z-ai/glm-4-32b` | 0.10/0.10 | 16/17* | 1905 / 2072 ms | 519 |
|
|
||||||
| `qwen/qwen3-30b-a3b-instruct-2507` | 0.043/0.17 | 16/17* | 1991 / 1866 ms | 588 |
|
|
||||||
| `openai/gpt-oss-120b` | levný | 16/17 | 7238 / 12164 ms | 3769 |
|
|
||||||
|
|
||||||
**Malé ollama modely** (`:cloud`):
|
|
||||||
|
|
||||||
| Model | Úspěšnost | Wall median / avg | out tok |
|
|
||||||
|---|---|---|---|
|
|---|---|---|---|
|
||||||
| `ministral-3:8b-cloud` | 15/17 | 1043 / 1169 ms | 653 |
|
| `glm` *(default)* | `glm-5.3-flash:cloud` | 976 000 | high |
|
||||||
| `nemotron-3-nano:30b-cloud` | 16/17 | 2015 / 2277 ms | 7805 |
|
| `glm53` | `glm-5.3:cloud` | 976 000 | high |
|
||||||
|
| `glm52` *(legacy)* | `glm-5.2:cloud` | 976 000 | high |
|
||||||
|
| `glmi51` *(legacy)* | `glm-5.1:cloud` | 196 608 | — |
|
||||||
|
| `kimi` | `kimi-k2.6:cloud` | 262 144 | — |
|
||||||
|
| `kimi27` | `kimi-k2.7-code:cloud` | 262 144 | — |
|
||||||
|
| `kimi3` | `kimi-k3:cloud` | 1 020 000 | — |
|
||||||
|
|
||||||
\* část „FAILů" jsou false negatives ve striktním porovnání (slovosled), ne chyby modelu.
|
`glmi51` a `glm52` jsou legacní — jen pro regression srovnání, k práci nepoužívat.
|
||||||
|
`kimi3` nepoužívat (viz níž), zvaž odstranění presetu z configu.
|
||||||
Klíčová pozorování z MiniLoop: **reasoning/thinking režim = pomalé + drahé na out tokeny**
|
|
||||||
(deepseek/minimax/gpt-oss/nemotron-nano generují násobně víc tokenů → násobně delší wall);
|
|
||||||
přímé parsery (haiku, gpt-nano, mistral-small) jsou rychlé. Hrdlo souběhu na ollama je
|
|
||||||
kvóta 3 paralelních dotazů, ne výpočet.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*Zdroje: rychlostní/inteligenční čísla Artificial Analysis (nezávislé); capability čísla
|
## Strategie modelů (potvrzeno uživatelem, 2026-02)
|
||||||
mix nezávislých (BenchLM, AA) a vendor dat (označeno); přímá měření na `nvidia.hell`.
|
|
||||||
Stav k červnu 2026.*
|
| Role | Model |
|
||||||
|
|---|---|
|
||||||
|
| **Daily driver** | `glm` — glm-5.3-flash |
|
||||||
|
| **Těžké úlohy** | `glm53` — glm-5.3 |
|
||||||
|
| **Kódování** | `kimi27` — kimi-k2.7-code (fallback: `kimi`) |
|
||||||
|
| **Běžné agentní práce na Kimi** | `kimi` — kimi-k2.6 |
|
||||||
|
| **Nepoužívat** | `kimi3` — extra high usage, zasekávání v agentním modu (2026-02) |
|
||||||
|
|
||||||
|
### Kdy přepnout na glm53 („těžká úloha")
|
||||||
|
|
||||||
|
- Multi-step research / deep-research skill (30+ iterací, cross-checking, dlouhé syntézy).
|
||||||
|
- Multi-file refactor (5+ souborů, velký kontext).
|
||||||
|
- Dlouhý debug / root-cause analýza přes víc systémů.
|
||||||
|
- Wiki-compile s velkými vstupy (drain tisíců řádků).
|
||||||
|
- Prompt injection / security analýza.
|
||||||
|
|
||||||
|
Pravidlo: nejdřív `glm` (flash); když task „cuchne" (model ztrácí nit, opakuje tool
|
||||||
|
call, potřebuje přes 100 iterací), restartuj na `glm53`.
|
||||||
|
|
||||||
|
### GLM-5.3 řada — srovnání (deep research, 2026-06)
|
||||||
|
|
||||||
|
| Model | AA Intelligence Index v4.1.1 | Ollama Cloud tok/s | TTFT | Kontext |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| GLM-5.3 | 60 | ~134 | ~0,7 s | 1M, **text-only** |
|
||||||
|
| GLM-5.3-Flash | 57 | ~131 | ~0,4 s | 1M, multimodální, MIT (320B/18B MoE) |
|
||||||
|
|
||||||
|
- Flash: nejlepší poměr inteligence/cena/rychlost; Toolathlon Verified 78.4
|
||||||
|
(Z.ai-reported, nejvyšší v jejich srovnávací sadě; nezávislé srovnání ale na
|
||||||
|
Toolathlon vede Kimi K3).
|
||||||
|
- GLM-5.3: stejné II jako Kimi K3, levnější, stabilnější — na těžší research.
|
||||||
|
- **GLM-5.3** = post-training upgrade GLM-5.2 (stejný base model); GLM-5.3-Flash je
|
||||||
|
první nativně multimodální GLM-5. Multimodální vstup (obrázky, screenshoty, video) jen
|
||||||
|
na flash — 5.3 je text-only (docs.z.ai).
|
||||||
|
|
||||||
|
### Kimi K2.6 vs K2.7 Code — kdo na co
|
||||||
|
|
||||||
|
K2.7 Code je **coding-focused fork** K2.6 (rel. 12. 6. 2026) — stejná architektura
|
||||||
|
(1T / 32B aktivní, 256K kontext, Modified MIT), liší se jen fine-tuningem. Moonshot ho
|
||||||
|
pozicuje jako doplněk: pro obecnou práci zůstat na K2.6 (v Kimi Code se requesty s
|
||||||
|
vypnutým thinkingem automaticky obsluhují K2.6). Přes MoonViT encoder umí i image/video
|
||||||
|
vstup, což je u coding modelu neobvyklé.
|
||||||
|
|
||||||
|
| | K2.6 | K2.7 Code |
|
||||||
|
|---|---|---|
|
||||||
|
| Pozice | generalista | coding fork |
|
||||||
|
| Agentní benchy (MCP Atlas, Claw 24/7) | baseline | +~10 % |
|
||||||
|
| Thinking tokeny | baseline | −~30 % |
|
||||||
|
| Non-thinking mode | ano | zrušen (thinking-on natvrdo) |
|
||||||
|
| Agent swarm 300 agentů / 4000 kroků | ano | necíleno |
|
||||||
|
|
||||||
|
- **K2.6**: 4000+ tool callů v jedné 12–13h session, 300 sub-agentů — stability strop
|
||||||
|
generace; model card ho explicitně pozicuje na persistentní 24/7 background agenty
|
||||||
|
(remind/heartbeat/dream workflow v nanobotu).
|
||||||
|
- **K2.7 Code**: jen kód, debugging, multi-file refactor, MCP-heavy smyčky. Mimo kód
|
||||||
|
nevýhodný — vždy reasoning (pomalejší, dražší), neumí swarm orchestraci.
|
||||||
|
- **K3**: AA II 60, multimodální (2.8T, KDA/AttnRes), 1M kontext — intelektuem
|
||||||
|
srovnatelný s GLM-5.3, ale na Ollama Cloud „extra high usage" (potvrzeno
|
||||||
|
ollama.com/library) + extrémní verbozita, v agentním modu se zaseká.
|
||||||
|
Nepoužívat.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Provozní fakta
|
||||||
|
|
||||||
|
- **Ollama Cloud** (endpoint `nvidia.hell`): max 3 paralelní dotazy; žádný rychlý
|
||||||
|
provider (Fireworks/Cerebras).
|
||||||
|
- **Prompt caching** zapíná nanobot jen pro `openrouter`, `anthropic`, `bedrock` —
|
||||||
|
ollama a gemini presety žádné cache breakpointy.
|
||||||
|
- **Kontextová okna**: nanobot má hardcoded default `context_window_tokens = 65 536`;
|
||||||
|
pokud preset hodnotu nepřepíše, jede model na 65k. Presety výš mají reálné limity.
|
||||||
|
Vyšší okno = méně častá konsolidace paměti, ale „lost in the middle" propad je
|
||||||
|
výraznější u slabších MoE modelů.
|
||||||
|
- **Reasoning/thinking režim = pomalé + drahé na out tokeny** (měřeno 2026-06 na
|
||||||
|
glm-5.1/minimax: non-thinking modely ~198 tok/s end-to-end vs ~40; AA: K2.6 output
|
||||||
|
~44 t/s, verbozita 170M toků/eval, 4× nad průměrem).
|
||||||
|
- **Vendor vs produkce:** ~37 % propad mezi lab benchmark skóre a reálným nasazením
|
||||||
|
(Kili Technology). Nejdůvěryhodnější nezávislé metriky: AA Intelligence Index,
|
||||||
|
Code Arena Elo.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Zdroje: artificialanalysis.ai (glm-5-3-flash — II v4.1.1 = 57), docs.z.ai (glm-5.3,
|
||||||
|
glm-5.3-flash), ollama.com/library (glm-5.3-flash, kimi-k3 — extra high usage),
|
||||||
|
huggingface.co (zai-org/GLM-5.3, moonshotai/Kimi-K3, Kimi-K2.7-Code),
|
||||||
|
platform.kimi.ai (thinking models). Ověřeno proti internetu 2026-08-29.*
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
409
|
424
|
||||||
@@ -407,3 +407,18 @@
|
|||||||
{"cursor": 407, "timestamp": "2026-07-20 08:00", "content": "(nothing)", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
{"cursor": 407, "timestamp": "2026-07-20 08:00", "content": "(nothing)", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
{"cursor": 408, "timestamp": "2026-07-21 08:00", "content": "(skip)", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
{"cursor": 408, "timestamp": "2026-07-21 08:00", "content": "(skip)", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
{"cursor": 409, "timestamp": "2026-07-22 08:00", "content": "(nothing)", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
{"cursor": 409, "timestamp": "2026-07-22 08:00", "content": "(nothing)", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
|
{"cursor": 410, "timestamp": "2026-07-23 08:00", "content": "- [durable] A scheduled cron job named \"nanobot-version-check\" should check PyPI for the latest nanobot-ai version and compare it to the installed version from `nanobot --version`.\n- [durable] If a newer nanobot-ai version exists, notify the user via Telegram with the current version, the new version, and the upgrade command `uv tool upgrade nanobot-ai`; if already up to date, do nothing.\n- [ephemeral] As of 2026-06-29, the installed nanobot version is 0.2.2 and PyPI has no newer version available.", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
|
{"cursor": 411, "timestamp": "2026-07-24 07:21", "content": "(nothing)", "session_key": "telegram:8826147089"}
|
||||||
|
{"cursor": 412, "timestamp": "2026-07-24 08:00", "content": "- [durable] Scheduled cron job `nanobot-version-check`: compare installed `nanobot-ai` version (via `nanobot --version`) to latest PyPI; if newer, send Telegram notification with current version, new version, and upgrade command `uv tool upgrade nanobot-ai`; if up to date, do nothing.\n- [ephemeral] As of 2026-06-30, installed `nanobot-ai` is `0.2.2` and latest PyPI version is also `0.2.2`, so no update was available.", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
|
{"cursor": 413, "timestamp": "2026-07-25 08:00", "content": "- [durable] Scheduled cron job \"nanobot-version-check\" checks PyPI for the latest nanobot-ai version, compares it with the installed version, and sends a Telegram notification with the current version, new version, and upgrade command `uv tool upgrade nanobot-ai` when an update is available.", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
|
{"cursor": 414, "timestamp": "2026-07-26 08:00", "content": "- [durable] Daily 08:00 cron job named `nanobot-version-check` checks PyPI for a newer `nanobot-ai` version.\n- [durable] Update check compares installed version from `nanobot --version` against latest PyPI `nanobot-ai` version.\n- [durable] If a newer version exists, notify via Telegram with current version, new version, and upgrade command `uv tool upgrade nanobot-ai`.\n- [permanent] User prefers responses in Czech.", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
|
{"cursor": 415, "timestamp": "2026-07-27 08:00", "content": "- [durable] User has a scheduled cron job named `nanobot-version-check` that checks PyPI for newer `nanobot-ai` versions against the locally installed version (`nanobot --version`); if an update exists, it notifies via Telegram with the current version, the new version, and the upgrade command `uv tool upgrade nanobot-ai`, otherwise it does nothing.", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
|
{"cursor": 416, "timestamp": "2026-07-28 08:00", "content": "(nothing)", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
|
{"cursor": 417, "timestamp": "2026-07-29 08:00", "content": "(nothing)", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
|
{"cursor": 418, "timestamp": "2026-07-30 08:00", "content": "(nothing)", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
|
{"cursor": 419, "timestamp": "2026-07-31 08:00", "content": "(nothing)", "session_key": "websocket:52d0f338-7a06-42e7-aad2-86a4cabbfb9f"}
|
||||||
|
{"cursor": 420, "timestamp": "2026-07-31 16:58", "content": "- [durable] User zajímá keyboard modding – ptal se na použití vypájených MX switchů do hotswap socketů\n- [ephemeral] Task: smazat cedule kouření", "session_key": "telegram:8826147089"}
|
||||||
|
{"cursor": 421, "timestamp": "2026-08-06 07:05", "content": "- [ephemeral] User removed the reminder \"vyčistit klimosku\" on 2026-08-06.\n- [permanent] User communicates in Czech and expects responses in Czech.", "session_key": "websocket:1863db40-4d9e-4ab2-a935-eab543c58b6d"}
|
||||||
|
{"cursor": 422, "timestamp": "2026-08-25 20:06", "content": "- [durable] `uv` is unavailable and system Python lacks `croniter`; the remind skill CLI cannot be executed via `uv run` and requires direct SQLite database access.\n- [permanent] Safety guard enforces a hard working-directory boundary on shell commands; blocked commands must not be retried with symlinks, base64 piping, alternative tools, or working_dir overrides.\n- [ephemeral] Model preset for this session is `kimi-k2.6:cloud` with a 262144-token context window and 16384 max output tokens.", "session_key": "telegram:8826147089"}
|
||||||
|
{"cursor": 423, "timestamp": "2026-08-28 13:26", "content": "- [ephemeral] User switched model preset to `kimi27` (`kimi-k2.7-code:cloud`) for the current session.", "session_key": "websocket:f6e1e265-7a37-451c-ad7a-f601c40fdc5a"}
|
||||||
|
{"cursor": 424, "timestamp": "2026-08-31 09:17", "content": "- [skip] Background cron drain task: compiled 17 inbox files from notes/inbox/ into notes/notes.md (created new, 7 thematic sections), moved all sources to notes/done/\n- [skip] Per note SKILL.md, the notes/ store is separate from agent memory (keep/MEMORY.md) — Dream must not touch notes/, so the compiled note contents (chata shopping list, DT Glass product details, ZOT work items, 25.5 cm chair-to-table measurement, etc.) live only in notes/notes.md and are not mirrored here\n- [skip] Two DT Glass product URLs (UNIVERSAL and Amber wine-bottle glasses, 69 Kč) fetched successfully — details filed under \"## DT Glass\" section in notes/notes.md\n- [skip] notes/notes.md did not exist before this compile; it was created fresh with sections: DevOps/Infra, Nanobot, Chata, DT Glass, Měření, 3D tisk, Work/ZOT", "session_key": "note-compile"}
|
||||||
|
|||||||
117
plans/self-reflection-skill.md
Normal file
117
plans/self-reflection-skill.md
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
# Self-reflection skill — plán
|
||||||
|
|
||||||
|
Stav: navrženo, čeká na schválení implementace
|
||||||
|
Datum: 2026-08-31
|
||||||
|
|
||||||
|
## Cíl
|
||||||
|
|
||||||
|
Skill pravidelně prochází vlastní historii tahů (`sessions/*.jsonl`) a vytěžuje z ní
|
||||||
|
opakující se chybové vzory (retry smyčky, runaway loops, wrong tool choice, plán bez
|
||||||
|
provedení). Nálezy reportuje; **nic nikdy nemodifikuje** mimo vlastní sandbox.
|
||||||
|
|
||||||
|
## Motivace (z diskuze)
|
||||||
|
|
||||||
|
- 532 session souborů / 16 MB / ~22,5k záznamů — mrtvá váha, nikdo je nečte.
|
||||||
|
- Lessons-learned dnes vznikají jen ručně (v tuře, kdy si chybu uvědomím) —
|
||||||
|
session log zachytí chyby i ty, které jsem nevědomky opakoval.
|
||||||
|
- `develop/` je doména Claude Code — self-reflection si drží vlastní store a
|
||||||
|
`develop/` vůbec neokousává.
|
||||||
|
- Ověřený recept z develop/history: opakované selhání = měkká instrukce v SKILL.md,
|
||||||
|
kterou reference popírá; fix = tvrdá STOP brána. Sebe-reflexe by měla takové
|
||||||
|
slabosti odhalovat *navrhovat* opravu, nikdy ji neaplikovat.
|
||||||
|
|
||||||
|
## Architektura — read-only, tvrdá hranice
|
||||||
|
|
||||||
|
Skill **nikdy nic nezapisuje** mimo vlastní sandbox. Žádné edity SKILL.md,
|
||||||
|
AGENTS.md, SOUL.md, develop/ — ani gates. LLM závěry mohou být chybné a autonomní
|
||||||
|
zápis by mohl pokazit celé chování agenta (rozhodnutí uživatele z diskuze).
|
||||||
|
|
||||||
|
**Píše pouze:**
|
||||||
|
- `results/<date>_self-reflection-*.md` — plný report včetně návrhů patchů
|
||||||
|
- `skills/self-reflection/state.json` — cursor (timestamp posledního zpracování)
|
||||||
|
- souhrn na Telegram (pattern compact-memory-auto)
|
||||||
|
|
||||||
|
**Čte:**
|
||||||
|
- `sessions/*.jsonl` (inkrementálně od cursoru)
|
||||||
|
- `develop/` (jen pro deduplikaci proti známým lekcím)
|
||||||
|
- vlastní `state.json`
|
||||||
|
|
||||||
|
## Průběh jednoho runu
|
||||||
|
|
||||||
|
1. **Skript (bez LLM):** diff cursor → nové soubory; odfiltrovat šum podle prefixů
|
||||||
|
názvů (`compact-memory-auto_*`, `dream:*`, `cli_*` testy) a krátké session
|
||||||
|
(< 5 zpráv). První run navíc prefiltruje backlog: mechanické signály
|
||||||
|
(stejný tool+argumenty ≥2× za sebou, error → identický retry, dlouhý reasoning
|
||||||
|
bez tool callu, opakované čtení stejného souboru) → kandidáti pro LLM.
|
||||||
|
Skript dělá jen mechanickou triáž/rank, žádné quality judgements.
|
||||||
|
2. **Agent tah:** přečte kandidáty, klasifikuje vzory:
|
||||||
|
- tool retry smyčka (re-run bez diagnózy)
|
||||||
|
- runaway loop (opakované čtení, edit↔lint smyčka)
|
||||||
|
- wrong tool choice (`exec cat` místo `read_file` apod.)
|
||||||
|
- plán bez provedení (multistep požadavek → odpověď bez tool callu)
|
||||||
|
Deduplikuje proti `develop/` a vlastním minulým reportům.
|
||||||
|
3. **Report:** dated soubor do `results/`; návrhy oprav jako hotové patche
|
||||||
|
(old_text → new_text) čekající na schválení. Souhrn na Telegram.
|
||||||
|
4. **Cursor:** posune `state.json`.
|
||||||
|
|
||||||
|
## Schvalování
|
||||||
|
|
||||||
|
- Návrhy patchů leží v reportu. Aplikace až na explicitní „proveď" /
|
||||||
|
„aplíkuj návrh N z posledního reportu" — pak patch aplikuju já v normálním
|
||||||
|
tuře (kontext, ověření, diff).
|
||||||
|
- Interface = přirozený jazyk, žádná nová mechanika.
|
||||||
|
|
||||||
|
## Spouštění
|
||||||
|
|
||||||
|
- **První run:** jednorázově přes backlog 532 starých souborů (s plnou
|
||||||
|
prefiltrací). Archeologie, ale může odhalit dlouhodobé vzory.
|
||||||
|
- **Dál:** inkrementálně. `cron` tool job, týdně, náhodná hodina, message
|
||||||
|
„spusť self-reflection skill na nové sessions". Analýza potřebuje LLM tah
|
||||||
|
→ agent turn, ne standalone shell skript.
|
||||||
|
- Increment za den je malý; týdenní dávka (~30–70 session) je akorát.
|
||||||
|
|
||||||
|
## Otevřené otázky
|
||||||
|
|
||||||
|
- Schválení implementace jako celku.
|
||||||
|
- Detailní podoba skriptu (signály, prahy) — vyřeší se při implementaci.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Záznam diskuze (2026-08-31)
|
||||||
|
|
||||||
|
**Východisko:** otázka „dokážeš se učit ze své vlastní historie?" → průzkum dat
|
||||||
|
skillů (SQLite db: 55 připomínek/589 doručení, 29 bookmarků, 12 flight searchů;
|
||||||
|
develop/history.md 117 záznamů; sessions/ 532 souborů nikdy nezpracovávaných).
|
||||||
|
|
||||||
|
**Nálezy z průzkumu:**
|
||||||
|
1. Opakující se selhání má naučený recept (hard STOP gate v SKILL.md), ale
|
||||||
|
není systematicky aplikovaný — 19 zmínek smyček/zaseknutí v develop/history.
|
||||||
|
2. Dream slabě deduplikuje — fakt o `nanobot-version-check` jobu ~7× znovu
|
||||||
|
v history.jsonl během jednoho týdne.
|
||||||
|
3. Připomínková data: špičky doručení 8–11 h a 19–20 h; témata zdraví /
|
||||||
|
chata+chlívek / administrativa.
|
||||||
|
4. Největší nevyužitá surovina: `sessions/` — 530+ session souborů, korpus
|
||||||
|
reálných tahů včetně chyb.
|
||||||
|
|
||||||
|
**Uživatel:** „knowledge je teď importováno a dělá ho Claude Code a ne ty;
|
||||||
|
ale to, že bys sám dělal vlastní korekci, zní dobře."
|
||||||
|
|
||||||
|
**Uživatel k prefiltraci:** „jak skript pozná, co má zahodit?" → dohoda:
|
||||||
|
skript dělá jen mechanickou triáž podle metadat (prefixy, počty zpráv,
|
||||||
|
opakování tool calls), quality judgements jsou výlučně LLM tahu. U inkrementálního
|
||||||
|
režimu je prefiltrace skoro zbytečná — smysl má jen pro první backlog run.
|
||||||
|
|
||||||
|
**Uživatel:** „měl by to být skill? pravidelně procházel historii a zhodnocoval
|
||||||
|
co zlepšit, jak, kam?" → dohoda: skill `self-reflection`, cursor pattern
|
||||||
|
(jako Dream `.dream_cursor`), weekly cron agent turn, report do results/,
|
||||||
|
návrhy patchů jako hotové diff bloky.
|
||||||
|
|
||||||
|
**Klíčové rozhodnutí uživatele:** „skill rozhodně NIKDY sám nic nemodifikuje,
|
||||||
|
ani skilly ani nic jiného — LLM závěry mohou být chybné a pak by to podělalo
|
||||||
|
celé chování agenta. Jak to schvalovat, je věc jiná."
|
||||||
|
→ Varianty A (autonomní gates) se ruší. Skill je striktně read-only mimo
|
||||||
|
vlastní sandbox. Schvalování: návrhy čekají v reportu, aplikace na explicitní
|
||||||
|
povel v normálním tuře.
|
||||||
|
|
||||||
|
**Poslední otevřená otázka:** první run přes backlog vs. čistý inkrementální
|
||||||
|
start. Návrh agenta: backlog jako první run (s prefiltrací), dál inkrementálně.
|
||||||
25
prompts/README.md
Normal file
25
prompts/README.md
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
# Prompt Overrides
|
||||||
|
|
||||||
|
This folder holds plain-language prompt overrides for this workspace.
|
||||||
|
|
||||||
|
## Dream memory
|
||||||
|
|
||||||
|
`dream.md` tells Dream how to organize memory in this workspace. Most users do not need to touch it. To create an editable copy, run:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/dream-prompt init
|
||||||
|
```
|
||||||
|
|
||||||
|
That creates `prompts/dream.md`. Edit it in plain Markdown. Delete or empty it to return to nanobot's default memory behavior.
|
||||||
|
|
||||||
|
## Heartbeat evaluator
|
||||||
|
|
||||||
|
`evaluator.md` overrides the system prompt for the heartbeat notification gate — the model that decides whether a heartbeat result is worth delivering. This is an advanced override; you rarely need it. Before editing, read the evaluator code and the default `evaluator.md`.
|
||||||
|
|
||||||
|
To create an editable copy, run:
|
||||||
|
|
||||||
|
```text
|
||||||
|
/evaluator-prompt init
|
||||||
|
```
|
||||||
|
|
||||||
|
That creates `prompts/evaluator.md`. It must still instruct the model to call the `evaluate_notification` tool; otherwise the gate fails closed and stays silent. Delete or empty the file to return to the built-in prompt.
|
||||||
22
reflect/findings.jsonl
Normal file
22
reflect/findings.jsonl
Normal file
File diff suppressed because one or more lines are too long
37
reflect/state.json
Normal file
37
reflect/state.json
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"cursor": "2026-09-02T06:22:12.130921",
|
||||||
|
"runs": [
|
||||||
|
{
|
||||||
|
"at": "2026-09-01 06:20",
|
||||||
|
"sessions": 15,
|
||||||
|
"batches": 1,
|
||||||
|
"open": 6,
|
||||||
|
"watch": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"at": "2026-09-01 06:27",
|
||||||
|
"sessions": 15,
|
||||||
|
"batches": 1,
|
||||||
|
"open": 8,
|
||||||
|
"watch": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"at": "2026-09-02 06:51",
|
||||||
|
"sessions": 26,
|
||||||
|
"batches": 1,
|
||||||
|
"open": 3,
|
||||||
|
"watch": 4,
|
||||||
|
"repeat_per_100": 57.7
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"at": "2026-09-02 09:08",
|
||||||
|
"window_from": "2026-08-12T09:08:44",
|
||||||
|
"sessions": 74,
|
||||||
|
"batches": 6,
|
||||||
|
"batches_total": 6,
|
||||||
|
"open": 23,
|
||||||
|
"watch": 6,
|
||||||
|
"repeat_per_100": 100.0
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
98
results/2026-06-24_bit-set-deep-research.md
Normal file
98
results/2026-06-24_bit-set-deep-research.md
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
# Sady bitů — deep research: kvalitní sada s multiplikacemi často používaných profilů
|
||||||
|
|
||||||
|
Zadání: sada bez nutnosti úplného sortimentu, ale s často používanými profily (PH2, PZ2, T20, T25) ve
|
||||||
|
vyšší/impact kvalitě, s multiplikacemi stejných bitů (vzor: DeWalt DT7944S, ale ten je v nekvalitní CrV
|
||||||
|
linii). Východiska: DeWalt DT7275 (10× Torx, FlexTorq, kvalitní doplněk), Milwaukee 4932492006 (56×
|
||||||
|
Shockwave).
|
||||||
|
|
||||||
|
## Nezávislé testy
|
||||||
|
|
||||||
|
### Project Farm (2020) — 10 značek PH2 impact bitů
|
||||||
|
Zdroj: https://whichbrandwins.com/tests/impact-driver-bits (sumarizace YouTube testu)
|
||||||
|
- **Vítěz: Milwaukee Shockwave** — nejlepší fit/wobble, nejmenší opotřebení po 100 vrtech do
|
||||||
|
pressure-treated dřeva, nejvyšší cam-out torque po opotřebení (84 in-lb), nejvyšší pevnost proti
|
||||||
|
zlomu (157 in-lb, remíza s Wiha).
|
||||||
|
- Wiha: 3. celkově, stejná pevnost jako Milwaukee, trochu horší fit.
|
||||||
|
- DeWalt Max Fit: střed–spodek; NEJNIŽŠÍ pevnost proti zlomu (140 in-lb), viditelné opotřebení hrotů.
|
||||||
|
- Makita Gold: slabý cam-out po opotřebení (56 in-lb, druhý nejhorší).
|
||||||
|
- Pozn.: testované DeWalt Max Fit ≠ FlexTorq linie.
|
||||||
|
|
||||||
|
### Tool Test Raw (12/2025) — Vickers tvrdost + cam-out + snap test
|
||||||
|
Zdroj: https://tooltestraw.com/harbor-freight-driver-bit-test/
|
||||||
|
- Tvrdost: Milwaukee ~790 HV (nejtvrdší), Makita ~705 HV, Spyder ~650, Hercules 484 („do not buy").
|
||||||
|
- Cam-out: **Makita Impact XPS nejlepší** — texturovaný hrot funguje jako tření materiál, „kousne" do
|
||||||
|
šroubu.
|
||||||
|
- Snap test: **Makita ~157 in-lb (nejlepší)**; Milwaukee ~140 in-lb (křehká — tvrdost = sklo).
|
||||||
|
- Ranking: Best overall Makita, best value FLEX (~30¢/ks), do not buy Hercules.
|
||||||
|
- Caveat: jeden zdroj, provozuje merch shop; Vickers data ale konkrétní.
|
||||||
|
|
||||||
|
### „Ящик с инструментом" (2024) — 30 modelů PH2
|
||||||
|
Zdroj: https://300.ya.ru/v_hbGBQ4IA (AI přepis), https://rutube.ru/video/78a2f76fd855de9392aaf5cb9cb758a6/
|
||||||
|
- Klíčové zjištění: **drahé bity nevyhrály.** Wera Impaktor (~900 RUB/ks) i Felo Impact E6
|
||||||
|
(630 RUB/ks) praskly na zkušebním šroubu; Wiha ne-torzní se ohnula; nejlepší poměr měl lacino
|
||||||
|
(33–60 RUB/ks, tvrdost 64–67 HRC, moment ~13–14 Nm).
|
||||||
|
- Důsledek: nad ~40 Kč/ks u PH2 se nezakládá žádná garance kvality. Značkové impact sady v pásmu
|
||||||
|
10–15 Kč/ks (Makita/Milwaukee multi-balíčky) jsou pravý sweet spot.
|
||||||
|
|
||||||
|
### Kontradikce mezi testy
|
||||||
|
- Project Farm → Milwaukee nejlepší; Tool Test Raw → Makita nejlepší, Milwaukee křehčí.
|
||||||
|
- Oba věrohodné: Milwaukee vyhrává na opotřebení hrotu (dlouhodobá životnost), Makita na odolnosti
|
||||||
|
proti zlomu při extrémním momentu.
|
||||||
|
|
||||||
|
## Alternativy (kritérium: multiplikace častých profilů + impact kvalita + cena)
|
||||||
|
|
||||||
|
### Makita B-66880 Impact Black — 35 ks, ~768 Kč ⭐ doporučení
|
||||||
|
Zdroje: https://www.makitapraha.cz/b-66880/ , https://sofiindustrialtools.com/en/product/screwdriver-set-35-pieces-1-4-hex-socket-impact-black-makita/ , https://www.hanzal-naradi.cz/bity-a-klice-sady-bitu
|
||||||
|
- Obsah: 16× 25 mm (PH1, 3×PH2, PH3, PZ1, 3×PZ2, PZ3, T15, 2×T20, 2×T25, T30)
|
||||||
|
+ 50 mm E-form (PH2, PZ2, T20, T25, T30, SL5,5) + magnetické hlavice 6/8/10/13 mm + držák.
|
||||||
|
- Přesně zadání: multiplikace PH2/PZ2/T20/T25, impact provedení, magnetické hlavice navíc.
|
||||||
|
- Makita impact ocel = vítěz snap + cam-out testu (Tool Test Raw).
|
||||||
|
|
||||||
|
### Milwaukee 4932492006 Shockwave — 56 ks, 579–830 Kč
|
||||||
|
Zdroje: https://www.klium.com/en/milwaukee-4932492006-shockwave-impact-duty-bit-set-56-piece-104241 , https://www.zbozi.cz/vyrobek/milwaukee-shockwave-impact-duty-4932492006-56-ks/
|
||||||
|
- Obsah: 48× 25 mm (4×PH2, 4×PZ2, 5×T20, 5×T25, 4×T30, …), 7× 50 mm, magnetický držák 60 mm.
|
||||||
|
- Celkový vítěz Project Farm testu; nejvíce kusů, nejnižší jednotková cena.
|
||||||
|
- Riziko: křehčí ocel (tvrdost 790 HV) — při extrémním kroutení lom dřív.
|
||||||
|
|
||||||
|
### Makita B-28597 Impact Gold — 11 ks, 364–429 Kč
|
||||||
|
Zdroje: https://bity.heureka.cz/makita-impact-gold-11ks-b-28597/ , https://www.makitapraha.cz/b-28597/
|
||||||
|
- Obsah: PH1-3, PZ1-3, T15/T20/T25/T30 + držák, 25 mm. Bez multiplikací, Gold = starší/nižší řada
|
||||||
|
než Black/XPS (CZ Makita prodejci: „Impact Premier má vyšší odolnost než Impact Gold").
|
||||||
|
- Kompaktní doplněk, ne primární sada.
|
||||||
|
|
||||||
|
### Wera Bit-Check 30 Impaktor 1 (057690) — ~1 578 Kč ❌ nedoporučeno
|
||||||
|
Zdroje: https://bity.heureka.cz/wera-bit-check-30-impaktor-30-ks/ , https://www.wera.de/en/tools/bit-check-30-impaktor-1
|
||||||
|
- 29 Impaktor bitů (PH1-3, PZ1-3, T10-T40, SL, hex) + držák s prstencovým magnetem.
|
||||||
|
- Proti: 2× cena Milwaukeeu, RU test zaznamenal lom Impaktoru, bez multiplikací častých profilů.
|
||||||
|
|
||||||
|
### Bosch Impact Control
|
||||||
|
Zdroj: https://www.boschtools.com/us/en/impact-tough-power-bits-43986-ocs-ac/
|
||||||
|
- Linie kvalitní (Xtended Torsion Zone, 10× životnost), ale v CZ jen jednotlivá/vícekusová balení —
|
||||||
|
žádná složená sada s multiplikacemi ekvivalentní zadání.
|
||||||
|
|
||||||
|
### Wiha MaxxTor / ImpactBits
|
||||||
|
Zdroje: https://www.stolarske-potreby.cz/bity/sada-bit-box-wiha-otocna-o-180-se-7-bity-pz-a-is/skupina=415/karta/produkt=2332
|
||||||
|
- Kvalita potvrzená testy (remíza se zlomem Milwaukee), ale v CZ roztříštěná nabídka — sady jen malé
|
||||||
|
(Bit-Box 7 ks) nebo výběr po jednom. Poskládat sadu = logistika navíc.
|
||||||
|
|
||||||
|
### DeWalt FlexTorq — poznámka k původním sadám
|
||||||
|
- DT7275 (10× Torx 57 mm, ~104–138 Kč): FlexTorq torsion, kvalitní kapesní doplněk na opasek.
|
||||||
|
- DT7944S: budget CrV, bez torzní zóny — důvod, proč hledat jinde.
|
||||||
|
- Vyšší DeWalt linie (Extreme FlexTorq DT7396T T25×5 apod., ~100–150 Kč/bal. 5 ks): nejvyšší kvalita
|
||||||
|
od DeWaltu, ale složená sada vyjde dráž než Milwaukee a bez držáku.
|
||||||
|
|
||||||
|
## Závěrečné doporučení
|
||||||
|
|
||||||
|
1. **Makita B-66880 (35 ks, ~768 Kč)** — primární: přesně zadání (multiplikace + impact + hlavice),
|
||||||
|
ocel vítěze snap/cam-out testu.
|
||||||
|
2. **Milwaukee 4932492006 (56 ks, 579–830 Kč)** — alternativa: celkový vítěz Project Farm, maximální
|
||||||
|
počet kusů a 50 mm bity; riziko křehkosti při extrémním kroutení.
|
||||||
|
3. **Wera Impaktor 30** — nedoporučeno za ~1 578 Kč (lom v testu, bez multiplikací).
|
||||||
|
4. DeWalt DT7275 zůstává jako doplněk (kapsa, Torx only).
|
||||||
|
|
||||||
|
## Rozpory a nejistoty
|
||||||
|
|
||||||
|
- Milwaukee vs Makita mezi testy (různé metodiky, oba PH2 impact).
|
||||||
|
- Tool Test Raw = jediný zdroj pro Vickers data.
|
||||||
|
- Kompletní obsah B-66880 potvrzen cross-checkem makitapraha.cz (CZ) + sofiindustrialtools (IT);
|
||||||
|
drobná nejistota v přesném rozpisu 16-ti 25mm bitů — ověřit při dodání.
|
||||||
100
results/2026-08-29_model-choice-agent-nanobot.md
Normal file
100
results/2026-08-29_model-choice-agent-nanobot.md
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# Model pro běžný agentní provoz v nanobotu — deep research (2026-08-29)
|
||||||
|
|
||||||
|
Kandidáti: Kimi K3, Kimi K2.7 Code, GLM-5.3, GLM-5.3-Flash. Kontext: Ollama Cloud prepaid, kvóta 3 paralelní dotazy, workload z historie (remind-dominantní, note/keep/wiki, občas deep-research a kód).
|
||||||
|
|
||||||
|
## Shrnutí
|
||||||
|
|
||||||
|
**GLM-5.3-Flash (`glm-5.3-flash:cloud`) zůstává nejlepší volbou pro běžný nanobot agent.** Má Intelligence Index 57,5 (jen ~2,5 bodu pod oběma flagšipy), druhý nejrychlejší TTFT (410 ms), multimodální vstup, 1M kontext a — rozhodující pro prepaid okno — **Medium Usage tier**, zatímco GLM-5.3 a K2.7 jsou High a K3 Extra High. Kimi K3 sice intelektem těží s GLM-5.3 (60 vs 59,5), ale je na Ollama Cloud nejdražší tier, ~2× verboznější, ~20 % pomalejší a v nanobotu se mi dříve zasekával. GLM-5.3 dává smysl jen jako ruční preset pro těžké úlohy (je text-only).
|
||||||
|
|
||||||
|
## Zjištění
|
||||||
|
|
||||||
|
### 1. Inteligence / agentní benchmarky
|
||||||
|
|
||||||
|
| Model | AA Intelligence Index | LLM-Stats agents index | Tool use index |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Kimi K3 | 59,7 [1] | 41,3 (#4) [2] | 36,9 (#1) [2] |
|
||||||
|
| GLM-5.3 | 59,5 [1] | 41,2 (#5) [2] | 35,4 (#2) [2] |
|
||||||
|
| GLM-5.3-Flash | 57,5 [1] | — | — |
|
||||||
|
| Kimi K2.7 Code | 43 [3] | — | — |
|
||||||
|
|
||||||
|
- K3 a GLM-5.3 jsou na II statisticky nerozlišitelné (60 vs 59,5–60). Head-to-head sdílených benchmarků: K3 vyhrává 5/9 (DeepSWE, FrontierSWE, Program Bench, Terminal-Bench 2.1, Toolathlon), GLM-5.3 4/9 (AutomationBench, HLE, PostTrainBench, SWE-Marathon) [2].
|
||||||
|
- GLM-5.3 má specificky silné long-horizon agentní skóre: Terminal-Bench 3.0 skok 4,6 → 28,3, SWE-Marathon 19,4 → 42,5 (vendor-run, nezávisle nereplikováno) [4].
|
||||||
|
- K2.7 Code je na II 43 výrazně pod ostatními — jeho síla je úzké kódování (MCPMark 81,1 > Opus 4.8 76,4), ne obecný agent [5].
|
||||||
|
|
||||||
|
### 2. Rychlost na Ollama Cloud (ollamatps, 24h avg, živé měření proti stejnému endpointu)
|
||||||
|
|
||||||
|
| Model | tok/s | TTFT | Reliability |
|
||||||
|
|---|---|---|---|
|
||||||
|
| GLM-5.3 | 134 | 699 ms | 100 % [6] |
|
||||||
|
| GLM-5.3-Flash | 131 | **410 ms** | 99 % [7] |
|
||||||
|
| Kimi K2.7 Code | 130 | 628 ms | 100 % [8] |
|
||||||
|
| Kimi K3 | 107 | 894 ms | 100 % [9] |
|
||||||
|
|
||||||
|
Flash má nejlepší TTFT; K3 je ~20 % pomalejší v propustnosti a ~2× pomalejší na start. Pro interaktivní smyčku (remind-cron, krátké tahy přes Telegram) je TTFT dominantní metrika.
|
||||||
|
|
||||||
|
### 3. Ekonomika prepaid okna — hlavní rozdílovač
|
||||||
|
|
||||||
|
Usage tier na Ollama Cloud [10][11][12][13]:
|
||||||
|
|
||||||
|
| Model | Usage tier | Verbozita (output tokenů na II eval) | $/II task (AA) |
|
||||||
|
|---|---|---|---|
|
||||||
|
| GLM-5.3-Flash | **Medium** | nižší | ~$0,09 [14] |
|
||||||
|
| GLM-5.3 | High | nižší | ~0,25× GLM-5.2 úrovně (odvozeno z ceny) |
|
||||||
|
| Kimi K2.7 Code | High | -30 % thinking tokenů vs K2.6 [5] | — |
|
||||||
|
| Kimi K3 | **Extra High** | **~130M (2× průměr 63M)** | **~$0,94** [15] |
|
||||||
|
|
||||||
|
- K3 pálí okno dvojnásobně: nejvyšší tier **a** ~2× verbozita. Na AA eval stál K3 $2 690 celkem vs Flash ~$0,09/task — řádově 10× rozdíl v nákladech na úlohu [14][15].
|
||||||
|
- Nezávislé API ceny potvrzují poměr: GLM-5.3 $1,40/$4,40 vs K3 $3/$15 per M tok; Flash na vlastním API $0,15/$0,50 list (proměrně ~9× levnější než GLM-5.3) [2][14].
|
||||||
|
- Komunitní měření High-tier modelu (GLM-5.2, Pro plán): ~53M tokenů / 5h okno — Extra High K3 to vyzírá násobně rychleji [16].
|
||||||
|
|
||||||
|
### 4. Reliability v agentním provozu
|
||||||
|
|
||||||
|
- **Kimi K3 v nanobotu**: vlastní provozní pozorování (2026-02) — v agentním modu se po několika minutách zasekl; knowledge base ho už tehdy vyřadila z defaultu. K3 navíc always-on exposed CoT; max effort u krátké úlohy spálil 13 000+ thinking tokenů [17].
|
||||||
|
- **GLM na Ollama**: komunitní zkušenost s GLM-5.2/5.3 řadou — stabilní, občasné dlouhé thinking s auto-stop (nutné ručně pokračovat; ~5× za měsíc) [16]. Thinking je u 5.3 řady vždy zapnutý, effort low/high/max; pro chat se doporučuje `clear_thinking` [4].
|
||||||
|
- **Flash caveat**: při defaultním OpenAI-kompatibilním requestu může většinu output tokenů spálit reasoning a viditelná odpověď být prázdná; pomohlo nastavení GLM-style thinking + větší output ceiling [14]. V nanobotu (`maxTokens: 16384`) by to neměl být problém, ale stojí za pozornost.
|
||||||
|
- Historie ukazuje jedno vyčerpání 200 iterací (deep-research, 2026-06-18) — verbozní modely toto riziko zvyšují.
|
||||||
|
|
||||||
|
### 5. Match na tvůj workload
|
||||||
|
|
||||||
|
- **Dominantně remind/note/keep + heartbeat + cron**: krátké tool-cally, Čeština, nízká latence důležitější než špičkový IQ → Flash (TTFT 410 ms, medium usage = okno vydrží).
|
||||||
|
- **Deep-research / wiki-compile**: dlouhé multi-step tahy, 30+ iterací, cross-checking → tady by GLM-5.3 přidal ~2,5 II bodu, ale za High tier a text-only. Stávající strategie „startuj na Flash, při zaseknutí restartuj na 5.3" je pořád rozumná.
|
||||||
|
- **Kódování**: K2.7 Code jen pro úzké coding session (II 43 je pro obecné agentování málo; 256K kontext).
|
||||||
|
- **Multimodalita**: Flash i K3 multimodální, GLM-5.3 čistě textový, K2.7 má vision (MoonViT) [5].
|
||||||
|
|
||||||
|
## Rozpory a nejistoty
|
||||||
|
|
||||||
|
- AA II pro GLM-5.3: 59,5 (ollamatps ref) vs 60 (explainx/officechai z AA evaluace 18. 8.) — v rámci šumu, obě ~rovno K3.
|
||||||
|
- GLM-5.3 vendor benchmarky (Terminal-Bench 3.0, CyberGym) nebyly nezávisle replikovány [4][17].
|
||||||
|
- Usage tier Multiplier mezi Medium/High/Extra High Ollama oficiálně nezveřejňuje — poměry odvozeny z komunitních měření a cen API, ne z primárního zdroje.
|
||||||
|
- `glm-5.3-flash:cloud` je na Ollama nový (tag 2 dny starý, ee13009634e3) — dlouhodobá reliability na našem endpointu neměřená.
|
||||||
|
|
||||||
|
## Verdikt
|
||||||
|
|
||||||
|
| Role | Model | Důvod |
|
||||||
|
|---|---|---|
|
||||||
|
| **Daily driver** | **GLM-5.3-Flash** | II 57,5 za Medium usage, nejlepší TTFT, multimodální, 1M ctx — nejlepší intelligence/cena/rychlost |
|
||||||
|
| Těžké úlohy (ručně) | GLM-5.3 | II 60, High tier — jen pro/deep-research, text-only |
|
||||||
|
| Kódování | Kimi K2.7 Code | MCPMark 81,1, High tier, II 43 jen pro coding |
|
||||||
|
| Nepoužívat | Kimi K3 | Extra High usage × 2× verbozita × pomalejší × zasekávání v nanobotu |
|
||||||
|
|
||||||
|
Potvrzuje se strategie z knowledge/models.md z června — aktualizovaná fakta ji jen upevňují (Flash nyní explicitně Medium tier, rychlosti a II potvrzeny živými daty).
|
||||||
|
|
||||||
|
## Zdroje
|
||||||
|
|
||||||
|
[1] Artificial Analysis — glm-5.3-flash / kimi-k3 / glm-5.3 — https://artificialanalysis.ai/models/glm-5-3-flash (a související model pages)
|
||||||
|
[2] LLM-Stats — GLM-5.3 vs Kimi K3 — https://llm-stats.com/models/compare/glm-5.3-vs-kimi-k3
|
||||||
|
[3] ollamatps — kimi-k2.7-code — https://ollamatps.com/models/ollama/kimi-k2.7-code/ (II ref 43)
|
||||||
|
[4] Ollama library — glm-5.3 — https://ollama.com/library/glm-5.3
|
||||||
|
[5] Ollama library — kimi-k2.7-code:cloud — https://ollama.com/library/kimi-k2.7-code:cloud
|
||||||
|
[6] ollamatps — glm-5.3 — https://ollamatps.com/models/ollama/glm-5.3/
|
||||||
|
[7] ollamatps — glm-5.3-flash — https://ollamatps.com/models/ollama/glm-5.3-flash/
|
||||||
|
[8] ollamatps — kimi-k2.7-code — https://ollamatps.com/models/ollama/kimi-k2.7-code/
|
||||||
|
[9] ollamatps — kimi-k3 — https://ollamatps.com/models/ollama/kimi-k3/
|
||||||
|
[10] Ollama library — kimi-k3:cloud (Usage: extra high) — https://ollama.com/library/kimi-k3:cloud
|
||||||
|
[11] Ollama library — glm-5.3:cloud (Usage: high) — https://ollama.com/library/glm-5.3:cloud
|
||||||
|
[12] Ollama library — kimi-k2.7-code:cloud (Usage: high) — https://ollama.com/library/kimi-k2.7-code:cloud
|
||||||
|
[13] Ollama library — glm-5.3-flash:cloud (Usage: medium, tags page) — https://ollama.com/library/glm-5.3-flash/tags
|
||||||
|
[14] GLBGPT — GLM-5.3 Flash Review (ceny Z.AI, AA $0.09/task) — https://www.glbgpt.com/hub/glm-5-3-flash-review/
|
||||||
|
[15] markhuang.ai — Kimi K3 130M output tokens catch — https://markhuang.ai/news/kimi-k3-130-million-token-catch
|
||||||
|
[16] linux.do — Ollama Pro GLM-5.2 usage test (53M/5h, reliability) — https://linux.do/t/topic/2597086
|
||||||
|
[17] TechTimes — K3 reasoning modes, 13k thinking tokens — https://www.techtimes.com/articles/320937/20260718/kimi-k3-adds-standard-high-reasoning-modes-documentation-maps-three-effort-tiers.htm
|
||||||
112
results/2026-09-01_reflect.md
Normal file
112
results/2026-09-01_reflect.md
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
# Self-reflection 2026-09-01
|
||||||
|
|
||||||
|
Zpracováno 15 session ve 1 dávkách. Nálezů: 8 (8 k review, 0 sledovaných).
|
||||||
|
|
||||||
|
## fbb44 · `answer-self-config-from-guesswork` [open/high]
|
||||||
|
|
||||||
|
Otázky o vlastní konfiguraci, schopnostech a volbě modelu nanobotu jsou odpovídány typovanými fakty místo ověření v dokumentaci, přestože SOUL.md nařizuje nejdřív web_fetch na nanobot.wiki docs. Vrcholí to úpravou vlastního config.json podle vymyšleného schématu, která se neprojevila; agent pak bez diagnózy opět požádal uživatele o restart.
|
||||||
|
|
||||||
|
**Výskyt:** 8× v 7 session
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket_bfc38e05` 2026-05-26 — u: byl by pro ucely nanobot vhodnejsi jiny qwen model? — doporučení qwen-plus a qwen-turbo s tvrzeními o latenci a nákladech, žádný dohledání ani docs fetch
|
||||||
|
- `websocket_b32cc526` 2026-05-26 — u: pouzivas pri spousteni python kodu uv tool? — odpověď Ano, odkaz na TOOLS.md, ačkoliv tentýž den dvě sessiony pouštěly python3 -c
|
||||||
|
- `websocket_36af5714` 2026-05-27 — tvrdé tvrzení, že vlastní slash příkazy nejsou možné a že vestavěné jsou jen /dream-log a /help, z hlavy, před jakýmkoli researchem
|
||||||
|
- `websocket_1ae70a88` 2026-05-27 — vymyšlené schéma tools.my.allow_set v config.json, edit_file na živý config, po restartu stále disabled — místo diagnózy opět požadavek na restart
|
||||||
|
|
||||||
|
**Návrh:** Při každém dotazu nebo akci týkající se konfigurace a schopností nanobotu nejprve načíst oficiální dokumentaci; config.json neupravovat podle paměti, jen po ověření schématu v dokumentaci.
|
||||||
|
|
||||||
|
**Patch:** `SOUL.md`
|
||||||
|
|
||||||
|
```diff
|
||||||
|
- - Pro dotazy o vlastním fungování nanobot (konfigurace, schopnosti, jak funguje) → nejdřív `web_fetch` na https://nanobot.wiki/docs/0.2.0/
|
||||||
|
+ - Pro dotazy o vlastním fungování nanobot (konfigurace, schopnosti, modely, jak funguje) → **před odpovědí i před jakoukoli úpravou config.json** `web_fetch` na https://nanobot.wiki/docs/0.2.0/ — bez ověřené dokumentace netipuj fakta a neupravuj konfiguraci
|
||||||
|
```
|
||||||
|
|
||||||
|
## f09a7 · `reimplement-without-checking-existing` [open/high]
|
||||||
|
|
||||||
|
Architektura jednoho cron jobu + skriptu + YAML úložiště pro /remind byla implementována v jedné session (~13:00), a odpoledne téhož dne ji jiná session navrhla a implementovala znovu od nuly pod jiným názvem — vznikly dva paralelní skripty, dva cron joby a dvakrát přepsané úložiště.
|
||||||
|
|
||||||
|
**Výskyt:** 4× v 5 session
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket_36af5714` 2026-05-27 ~13:00 — implementace remind_check.py + remind-check cron job + převod reminder.md na YAML, complete_goal ohlašuje hotovo
|
||||||
|
- `websocket_a819aa9d` 2026-05-27 14:39 — stejný den stejný návrh single-runner architektury jako novinka: remind_runner.py + remind-runner job, smazání 8 jobů, další přepsání reminder.md; při re-read SKILL.md agent konstatuje, že soubor je úplně jiný, než čeká, a pokračuje dál bez zjištění proč
|
||||||
|
|
||||||
|
**Návrh:** Před návrhem nebo implementací architektury vždy nejdřív vypsat aktuální stav workspace pro danou feature (scripts/, cron list, SKILL.md) a zjistit, zda už podobná implementace neexistuje.
|
||||||
|
|
||||||
|
## f4f66 · `unverified-success-claim` [open/high]
|
||||||
|
|
||||||
|
Úspěch/uložení je ohlašován bez důkazu — včetně situací těsně po selhání zápisu, po slibu opravy bez jediného tool calu a po prezentace obsahu souboru bez úspěšného načtení.
|
||||||
|
|
||||||
|
**Výskyt:** 8× v 8 session
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket_9fc24346` 2026-05-27 07:52 — my(set) → ERROR set is disabled; přesto odpověď jen Poznamenáno. bez upozornění, že se nic neuložilo
|
||||||
|
- `websocket_b5891423` 2026-05-27 07:36 — uživatel upozorní na chybějící diakritiku, agent slíbí opravu, neprovede žádný tool call, pak vypíše tři úkoly s diakritikou, ačkoliv read_file call selhal (leaked) a soubor obsahoval dva úkoly bez diakritiky
|
||||||
|
- `websocket_36af5714` 2026-05-27 — agent ohlásí Tady je celý obsah skills/remind/SKILL.md, uživatel odpovídá nic nevidim — obsah nebyl doručen, musel se posílat znovu
|
||||||
|
|
||||||
|
**Návrh:** Nikdy neohlašovat uložení ani splnění bez úspěšného výsledku toolu; po selhání nebo leaku call selhání přiznat a operaci provést znovu.
|
||||||
|
|
||||||
|
## f0720 · `tool-call-leaked-as-text` [open/high]
|
||||||
|
|
||||||
|
Tool call se do odpovědi dostane jako surový text se speciálními tokeny; v jednom případě to byla poslední zpráva session, takže uživatel nedostal žádnou odpověď na svou otázku.
|
||||||
|
|
||||||
|
**Výskyt:** 4× v 4 session
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket_b5891423` 2026-05-27 07:36 — read_file reminder.md leaknuto jako text s <|tool_calls_section_begin|> tokeny; následující odpověď pak obsahuje obsah, který neprošel úspěšným čtením
|
||||||
|
- `websocket_d387aab2` 2026-05-27 07:38 — grep call na memory/history.jsonl leaknuto jako text jako závěrečná zpráva — session končí bez odpovědi na otázku, zda si agent dřívější zadání někde poznamenal
|
||||||
|
|
||||||
|
**Návrh:** Po leaku tool call nikdy neodpovídat z předpokládaného obsahu; call provést znovu a výsledek ověřit.
|
||||||
|
|
||||||
|
## ff77b · `retry-without-diagnosis` [open/medium]
|
||||||
|
|
||||||
|
Po selhání nebo zkráceném výsledku web_fetch se stejný call opakuje se stejnými nebo poškozenými argumenty místo diagnózy režimu selhání (bot ochrana, paywall, guard proti opakovaným lookupům).
|
||||||
|
|
||||||
|
**Výskyt:** 18× v 4 session
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket_2c3e3ae3` 2026-05-27 — ~8 web_fetch pokusů na týž Medium článek; výstupy 455–933 B zjevně indikují blokaci; jeden call má poškozenou dvojitou r.jina.ai URL (r.jina.ai/http://r.jina.ai/http://medium.com/…) a stejný cíl se fetchuje znovu i po zjištění bot ochrany
|
||||||
|
- `websocket_36af5714` 2026-05-27 — web_fetch na discussions/431 dvakrát zablokován guardem repeated external lookup blocked, následují další téměř identické search variace; předtím tři cat+python parse pokusy tool-result souboru, dvrátí 13 B, až potřetí se argument opraví
|
||||||
|
|
||||||
|
**Návrh:** Po dvou po sobě jdoucích neúspěšných nebo výrazně zkrácených fetších téhož cíle zastavit, pojmenovat pozorovaný režim selhání a změnit strategii (jiný zdroj, požádat uživatele o text), nikoli opakovat tentýž call.
|
||||||
|
|
||||||
|
## ff93a · `correction-not-applied` [open/medium]
|
||||||
|
|
||||||
|
Poté, co uživatel opravil pravidlo pro zápis poznámek (psát s diakritikou), agent opravu potvrdil, ale stávající záznamy nikdy neopravil a následné zápisy ve třech dalších sessionech stále bez diakritiky.
|
||||||
|
|
||||||
|
**Výskyt:** 4× v 4 session
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket_b5891423` 2026-05-27 07:36 — u: nerikal jsem v pokynech, ze vsechny poznamky mas zapisovat s diakritikou? — agent souhlasí, žádná oprava souboru neproběhne
|
||||||
|
- `websocket_9fc24346` 2026-05-27 07:52 — edit_file ponechává staré řádky zaplatit clensky prispevek SČMBD bez diakritiky, diakritiku má jen nově přidaný řádek
|
||||||
|
- `websocket_36af5714` 2026-05-27 ~13:00 — write_file reminder.md při převodu na YAML stále obsahuje zaplatit clensky prispevek SČMBD bez diakritiky
|
||||||
|
- `websocket_a819aa9d` 2026-05-27 14:39 — write_file reminder.md a následně reminder.yaml opět s textem zaplatit clensky prispevek SČMBD bez diakritiky
|
||||||
|
|
||||||
|
**Návrh:** Při uživatelově korekci okamžitě opravit všechny postižené uložené záznamy a pravidlo persistovat (keep skill / dokumentace skillu), aby pozdější sessiony dodržovaly je také.
|
||||||
|
|
||||||
|
## f5638 · `system-python-instead-of-uv` [open/low]
|
||||||
|
|
||||||
|
Python one-linery spouštěny přes systémový python3 -c navzdory konvenci uv v AGENTS.md; agent navíc na přímou otázku tvrdil opak.
|
||||||
|
|
||||||
|
**Výskyt:** 6× v 4 session
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket_de1ff685` 2026-05-26 18:40 — exec python3 -c pro timezone a aktuální čas
|
||||||
|
- `websocket_e342c853` 2026-05-26 18:54 — exec python3 -c dvakrát; první pokus také tipuje neexistující import pytz a selhává, druhý opraven na zoneinfo
|
||||||
|
|
||||||
|
**Návrh:** Žádný patch — konvence v AGENTS.md už existuje; od session b32cc526 (19:07) agent uv dodržel, stačí hlídat při budoucích one-linerech.
|
||||||
|
|
||||||
|
## fdb1c · `fan-out-cron-jobs-per-reminder` [open/low]
|
||||||
|
|
||||||
|
Připomínka s více časy je zakládána jako více samostatných cron jobů, aniž by byl vynesen tradeoff více jobů vs jeden job s vícero plány či datově řízený runner; uživatel to následně označil za hlavní slabinu návrhu.
|
||||||
|
|
||||||
|
**Výskyt:** 3× v 2 session
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket_36af5714` 2026-05-27 — brano-dvere-18 a brano-dvere-19, poté clensky-prispevek-9/14 a vodomery-9/14 — celkem 6 jobů pro 3 připomínky, bez zmínky o alternativách
|
||||||
|
- `websocket_a819aa9d` 2026-05-27 14:39 — uživatel: neni soucasny model /reminder nejak moc slozity? … zaklada hromadu cron zaznamu i vice pro jeden zaznam
|
||||||
|
|
||||||
|
**Návrh:** Když jedna připomínka vyžaduje více časů, před vytvořením více jobů vyložit nahlas možnosti (jeden job s vícero plány vs jeden datově řízený runner) a nechat uživatele rozhodnout.
|
||||||
|
|
||||||
443
results/2026-09-02_reflect.md
Normal file
443
results/2026-09-02_reflect.md
Normal file
@@ -0,0 +1,443 @@
|
|||||||
|
# Self-reflection 2026-09-02
|
||||||
|
|
||||||
|
Zpracováno 74 session ve 6 dávkách. Nálezů: 29 (23 k review, 6 sledovaných).
|
||||||
|
|
||||||
|
Okno: od 2026-08-12, dávek 6/6.
|
||||||
|
Známé vzory: 100,0 výskytu / 100 session (minule 57,7).
|
||||||
|
|
||||||
|
## f999d · `retry-without-diagnosis` [open/high] — REGRESE
|
||||||
|
|
||||||
|
V research session o náhradě claude.ai se agent po prvním zablokování (chyba repeated external lookup blocked, která explicitně říkala použít už získaná data) zasekl v dlouhé smyčce: tutéž URL GitHub API releases/291846033 volal znovu a znovu (~35krát) a mezi to pouštěl prakticky totožné web_search dotazy, kterými se blok resetoval. Jde o obejití runtime guardu místo zastavení; session má 424 zpráv, uživatel čekal na stovky zbytečných callů, a výsledné tvrzení o verzi 0.8.6 z března 2026 zůstalo navíc neověřené, protože všechny pokusy o stažení changelogu skončily 1.5 kB stubem.
|
||||||
|
|
||||||
|
**Výskyt:** 38× v 3 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:ef53ecfb-6aae-42ff-ac6a-64cdb0b849fe` 2026-08-12 — web_fetch api.github.com/repos/open-webui/open-webui/releases/291846033 → ERROR repeated external lookup blocked, opakováno ~35× v prokládání s ~25 téměř identickými web_search dotazy (v0.8.6 changelog full features list …)
|
||||||
|
- `websocket_08a0c453` 2026-05-27 — edit_file → ERROR old_text not found; po re-read agent zopakoval edit_file se stejným old_text → ERROR znovu; teprve poté zjistil, že hodnoty v YAML nejsou v uvozovkách, a upravil argumenty.
|
||||||
|
- `websocket_1a49eb18` 2026-05-27 — read_file(path=skills/remind/SKILL.md) → ok, 89 B, ×3 za sebou se stejnými argumenty (podezřele malý výsledek nebyl diagnostikován), teprve čtvrtý pokyn přes exec cat přinesl plných 4.7 kB.
|
||||||
|
|
||||||
|
**Návrh:** K existujícímu pravidlu v SOUL.md o zastavení po dvou neúspěšných fetších doplnit explicitní zákaz: když tool vrátí repeated lookup blocked nebo jiný guard, je zakázané blok resetovat přes interleaved web_search a fetch tutéž URL znovu — odpovědět z již získaných dat nebo pojmenovat režim selhání a skončit.
|
||||||
|
|
||||||
|
## fa495 · `retry-without-diagnosis` [open/high] — REGRESE
|
||||||
|
|
||||||
|
New occurrences of the open retry-without-diagnosis pattern. In the Windows Terminal session the same stackexchange URL was fetched a second time with identical arguments after already returning 403, and dozens of near-identical web_search calls were fired after repeated identical DuckDuckGo failures (No results found, ConnectError, ConnectTimeout) without naming the failure mode or changing strategy. The SOUL.md rule to stop after two failed fetches of the same target was visible in the profile the whole time and was not applied.
|
||||||
|
|
||||||
|
**Výskyt:** 64× v 4 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:f6e1e265-7a37-451c-ad7a-f601c40fdc5a` 2026-08-28 — web_fetch unix.stackexchange.com/questions/579818 -> ERROR 403 Forbidden, later web_fetch the same URL again -> ERROR 403 Forbidden
|
||||||
|
- `websocket:f6e1e265-7a37-451c-ad7a-f601c40fdc5a` 2026-08-28 — web_search -> ERROR DuckDuckGo search failed (No results found / ConnectError / ConnectTimeout) dozens of times, each followed by another batch of near-identical queries with one keyword swapped
|
||||||
|
- `websocket:ef53ecfb-6aae-42ff-ac6a-64cdb0b849fe` 2026-08-12 — web_fetch api.github.com/repos/open-webui/open-webui/releases/291846033 → ERROR repeated external lookup blocked, opakováno ~35× v prokládání s ~25 téměř identickými web_search dotazy (v0.8.6 changelog full features list …)
|
||||||
|
- `websocket_08a0c453` 2026-05-27 — edit_file → ERROR old_text not found; po re-read agent zopakoval edit_file se stejným old_text → ERROR znovu; teprve poté zjistil, že hodnoty v YAML nejsou v uvozovkách, a upravil argumenty.
|
||||||
|
- `websocket_1a49eb18` 2026-05-27 — read_file(path=skills/remind/SKILL.md) → ok, 89 B, ×3 za sebou se stejnými argumenty (podezřele malý výsledek nebyl diagnostikován), teprve čtvrtý pokyn přes exec cat přinesl plných 4.7 kB.
|
||||||
|
|
||||||
|
**Návrh:** Enforce the existing two-failure STOP rule also for web_search, not just web_fetch: after two identical failure modes on the same target or query family, name the failure mode aloud and pivot or stop.
|
||||||
|
|
||||||
|
## fb27b · `retry-after-safety-guard-block` [open/high]
|
||||||
|
|
||||||
|
Po zabločení exec příkazu safety guardem (path outside working dir) agent opakoval tentýž nebo téměř tentýž příkaz místo okamžité změny strategie. Guard je hard policy boundary, ne přechodná chyba — opakování jen pálí turny a porušuje explicitní pravidlo v SOUL/AGENTS. Rekurentní v 4 ze 17 sessions, v jedné session až 3 pokusy za sebou.
|
||||||
|
|
||||||
|
**Výskyt:** 9× v 6 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `efb148d7` 2026-08-31 — exec curl api.github.com repos HKUDS nanobot milestones → ERROR safety guard, retried with working_dir → ERROR, retried again nearly identical → ERROR (3×); later contents API blocked twice before finally writing a tmp/ script
|
||||||
|
- `692912c4` 2026-08-29 — list_dir /home/nanobot/.nanobot → ERROR outside workspace, then immediately exec ls -la /home/nanobot/.nanobot/sessions/ → ERROR safety guard
|
||||||
|
- `695fd33b` 2026-08-29 — exec python3 -c → ERROR safety guard, then exec with cat-heredoc into tmp inside the same command → ERROR safety guard again
|
||||||
|
- `eca5b6fa` 2026-08-29 — exec ls -a /home/nanobot/.nanobot/ → ERROR, then exec ls /home/nanobot/.local/share/uv/tools/nanobot-ai/... → ERROR (sibling outside-workspace path)
|
||||||
|
- `websocket:ef53ecfb-6aae-42ff-ac6a-64cdb0b849fe` 2026-08-12 — exec python3 -c s cestou .nanobot/tool-results → ERROR blocked; tentýž příkaz znovu → ERROR; třetí pokus se změněným working_dir → ERROR
|
||||||
|
- `websocket:41b4e76b-7401-4ea3-b71b-b2391a24ce3d` 2026-08-26 — exec ls ~/.cargo/bin + ls ~/.rustup/toolchains → ERROR blocked; druhý pokus se stejnými cestami mimo workspace → ERROR blocked
|
||||||
|
|
||||||
|
**Návrh:** Add an explicit no-retry rule to the exec Tool section of AGENTS.md: one block means change strategy (workspace-local script or file tool), never re-run the same or a near-identical command, never try sibling paths outside the workspace.
|
||||||
|
|
||||||
|
**Patch:** `AGENTS.md`
|
||||||
|
|
||||||
|
```diff
|
||||||
|
- Write scripts to files inside the workspace (e.g. `tmp/script.lua`) and run them with `working_dir` set to the workspace root.
|
||||||
|
+ Write scripts to files inside the workspace (e.g. `tmp/script.lua`) and run them with `working_dir` set to the workspace root.
|
||||||
|
+
|
||||||
|
+ A safety-guard block is a hard policy boundary, not a transient error: never retry the same or a near-identical command, and never try a sibling path outside the workspace. On the first block, switch to a workspace-local script or a file tool — or state that the target is unreachable and stop.
|
||||||
|
```
|
||||||
|
|
||||||
|
## fb33c · `speculation-presented-as-fact` [open/high]
|
||||||
|
|
||||||
|
Concrete AliExpress item URLs were presented as specific verified listings when they came unverified from search snippets, and could not be fetched (bot protection). The user tried them, most were dead, and only then asked for verification. The agent also stated an unsourced ZOYI rebrand history as fact. Harm is direct: the user acted on the links and wasted time. The user preference for multi-source verification and the agent own rule to name failure modes were both in force here.
|
||||||
|
|
||||||
|
**Výskyt:** 9× v 6 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:e5b6bebd | 2026-09-01 20:56` 2026-09-01 — answer lists specific aliexpress item links as concrete listings; user replies that most of the links do not work; later fetches of two of them return page under maintenance and captcha, so verification was impossible from this environment
|
||||||
|
- `websocket:076a6c1c` 2026-09-01 — review summary stated 4 watch findings as fact; grep of findings.jsonl showed 0 records with status watch; agent admitted the number was invented rather than read from the store
|
||||||
|
- `websocket:6f8fcc41` 2026-08-31 — first wood answer presented energy densities and derived Kč/GJ price-per-heat comparisons as facts with no source lookup; the user then used them to justify a 7980 Kč purchase (weaker instance, figures were marked as approximate)
|
||||||
|
- `d542906d` 2026-08-30 — První odpověď bez tool callů tvrdí: extrémní chudoba klesla za 40 let z ~40 % lidstva pod 10 %, ekonomika USA je z ~80 % domácí služby, uhlíková intenzita HDP klesá ~2 % ročně, civilizace spotřebuje ~20 TW vs 170 000 TW slunečního příkonu. Až po námitce uživatele následoval web_search na UN WPP 2024
|
||||||
|
- `websocket:7a131ba2-f227-445b-be5e-6f8d0ad72f34` 2026-08-28 — turn 1 asserts teplota and sliny/lipidy effects as fact; after user pushback the agent fully reverses both; when asked whether it is an estimate or has real evidence the agent answers: je to můj odhad ... nemám pro to ověřený podklad v české legislativě
|
||||||
|
- `websocket:7a131ba2-f227-445b-be5e-6f8d0ad72f34` 2026-08-28 — final answer claims vyhláška 137/2004 Sb. explicitně zakazuje + vlastnictví přechází na zákazníka, sourced only from web_search snippets, no web_fetch of zakonyprolidi.cz or the vyhláška text
|
||||||
|
|
||||||
|
**Návrh:** Never present a deep item URL as a working listing unless it was fetched successfully or the user supplied it. When fetches fail or are bot-blocked, say so and give search-page URLs only, with an explicit note that item links are unverified. This applies to any shop with bot protection; AliExpress fits the existing PCTuning and zive precedent already listed in skill docs.
|
||||||
|
|
||||||
|
## fc4a7 · `retry-after-safety-guard-block` [open/medium]
|
||||||
|
|
||||||
|
Po zabločení exec příkazu safety guardem (path outside working dir) agent okamžitě opakoval tentýž nebo téměř tentýž příkaz, místo aby ho přeformuloval na cestu uvnitř workspace nebo použil file tool. Guard je v AGENTS.md dokumentovaná hard boundary, retry nemá šanci projít — jde o čisté ztracené turny.
|
||||||
|
|
||||||
|
**Výskyt:** 3× v 2 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:ef53ecfb-6aae-42ff-ac6a-64cdb0b849fe` 2026-08-12 — exec python3 -c s cestou .nanobot/tool-results → ERROR blocked; tentýž příkaz znovu → ERROR; třetí pokus se změněným working_dir → ERROR
|
||||||
|
- `websocket:41b4e76b-7401-4ea3-b71b-b2391a24ce3d` 2026-08-26 — exec ls ~/.cargo/bin + ls ~/.rustup/toolchains → ERROR blocked; druhý pokus se stejnými cestami mimo workspace → ERROR blocked
|
||||||
|
|
||||||
|
**Návrh:** Do sekce exec Tool v AGENTS.md doplnit: po bloku safety guardem nepřepouštět tentýž příkaz se stejnými cestami; buď přepsat cestu do workspace, použít file tool, nebo rovnou přiznat nedostupnost.
|
||||||
|
|
||||||
|
## f4313 · `answer-self-config-from-guesswork` [open/medium] — REGRESE
|
||||||
|
|
||||||
|
Na otázku kde se kimi k3 zasekl agent odpověděl konkrétními neověřenými domněnkami o vlastním runtime a provideru (defaultní CoT 50k-100k+ tokenů, $1.0 odpovídá ~100k tokenům, parametr enable_thinking) jako pravděpodobnou příčinou. Přístup k provider logům přiznal až poté, co čísla prezentoval — fakta o vlastním chování typovaná nahlas místo přiznání nevím.
|
||||||
|
|
||||||
|
**Výskyt:** 5× v 5 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:8e293585-f00f-4b72-893d-b9adc6adb1a5` 2026-08-18 — odpověď: Nejpravděpodobnější příčina: Kimi k3 má extrémně dlouhý defaultní CoT … 50k-100k+ tokenů, $1.0 což odpovídá ~100k tokenům — bez jediného ověřovacího tool callu, logy dostupné nejsou
|
||||||
|
- `websocket_2dc073ed` 2026-05-28 — u: pokud se nahraje novy skill je okamzite funkcni? → a: Ne, není okamžitě funkční… musí se runtime restartovat — bez jediného fetche doku; uživatel: a podival si se na nanobot.wiki, mas to primo napsane v SOUL.md. Později session b818067e ověřila ze zdrojáku skills.py opak: načítá se každý turn, restart není potřeba.
|
||||||
|
- `websocket_da4e5a03` 2026-05-29 — u: budes to delat pres sqlite cli nebo pres mcp? → a: MCP v tomto prostředí nemám — nanobot používá vlastní tools, ne MCP servery — bez lookups; opačný závěr už dříve potvrdila dokumentace fetchnutá v session 0df35595 (tools.mcpServers je v nanobotu podporované).
|
||||||
|
- `websocket_88ba0649` 2026-05-28 — u: jaky z techto modelu dava nejvetsi vyznam pro nanobot → a doporučení s typovanými specifikacemi (Lokální inference na nvidia.hell, Kimi 2M tokenů) bez ověření; uživatel musel opravit: vsechny vylistovane modely jsou v cloudu, navic ty od ollama za predplatne.
|
||||||
|
- `websocket_f6e42993` 2026-05-27 — u: jaky z techto modelu dava nejvetsi smysl pro tvuj beh → a: Qwen 2.5 Coder, ideálně 32B, případně 14B podle VRAM — doporučení pro lokální GPU, přitom běželo Ollama cloud; uživatel opravil: bezi to v ollama cloudu, takze to je asi nejakej nadupanejsi model.
|
||||||
|
|
||||||
|
**Návrh:** K pravidlu o vlastním fungování v SOUL.md doplnit: u produkčních incidentů vlastního runtime, kde logy nejsou dostupné, odpovědět nevím + co by ověření vyžadovalo, bez konkrétních čísel a názvů parametrů.
|
||||||
|
|
||||||
|
## fc8dd · `speculation-presented-as-fact` [open/medium]
|
||||||
|
|
||||||
|
Confident factual claims were presented without any source, and uncertainty was admitted only after the user explicitly challenged them. In the beer session the agent asserted temperature and saliva effects as fact, then fully reversed when the user said he believed neither, then admitted the hygiene-regulation claim was an unverified guess when asked whether it had real evidence. In the final answer it quoted a Q&A snippet from search results as black-on-white legislative proof (no web_fetch of the primary source was ever made) and added an ownership-transfer legal interpretation that is pur…
|
||||||
|
|
||||||
|
**Výskyt:** 4× v 2 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:7a131ba2-f227-445b-be5e-6f8d0ad72f34` 2026-08-28 — turn 1 asserts teplota and sliny/lipidy effects as fact; after user pushback the agent fully reverses both; when asked whether it is an estimate or has real evidence the agent answers: je to můj odhad ... nemám pro to ověřený podklad v české legislativě
|
||||||
|
- `websocket:7a131ba2-f227-445b-be5e-6f8d0ad72f34` 2026-08-28 — final answer claims vyhláška 137/2004 Sb. explicitně zakazuje + vlastnictví přechází na zákazníka, sourced only from web_search snippets, no web_fetch of zakonyprolidi.cz or the vyhláška text
|
||||||
|
- `websocket:e93b786a-7792-4f0e-97f0-2efe15dc9aed` 2026-08-29 — Flash spotřebuje ~20× méně kvóty za stejné chytré chování u 90 % tvých úloh — invented numbers, no source
|
||||||
|
|
||||||
|
**Návrh:** Mark unverified claims as estimates in the first answer, not after challenge; for legal or numeric claims fetch the primary source before asserting them, and when reversing position under pushback do it on evidence, not to please the user.
|
||||||
|
|
||||||
|
## ff610 · `research-loop-past-sufficiency` [open/medium]
|
||||||
|
|
||||||
|
U jednoduchých faktografických dotazů agent pokračoval ve fetch/search smyčce i poté, co měl odpověď. V jednom případě ~11 tool callů na jednu adresu, v druhém ~12 callů na špatně čtený dotaz, než si uvědomil, že jde o překlep (bity vs byty). Tentýž režim způsobil i vytuhlé sessions u sběrného dvora — agent si ho v diagnostické session sám pojmenoval jako research loop bez syntézy.
|
||||||
|
|
||||||
|
**Výskyt:** 2× v 2 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `10e98a4d` 2026-08-29 — ~11 tool callů (3 web_search, 4 web_fetch, 2 Nominatim) pro jednu adresu kravína; obec odpověděla po 3 fetchech. Self-diagnóza v 692912c4: měl odpověď po 2.-3. fetchi, ale pokračoval v dalších searchích
|
||||||
|
- `bbff61a1` 2026-08-30 — ~12 tool callů nad interpretací byty = bytové jednotky (akebyty.sk, panelák typologie, developerské projekty) než agent dospěl k zjevnému překlepu na bity PZ2/PH2 a odpověděl z jednoho fetche
|
||||||
|
|
||||||
|
**Návrh:** Přidat sufficiency gate: po prvním kole úspěšných fetchů, které dotaz zodpovědělo, okamžitě syntetizovat; další calls jen při konfliktu nebo chybějících datech. U jednoznačně nejednoznačného dotazu (typo) se nejdřív zeptat, než spustit research řetěz.
|
||||||
|
|
||||||
|
## f01dd · `answer-self-config-from-guesswork` [open/medium] — REGRESE
|
||||||
|
|
||||||
|
Otázka o vlastní konfiguraci nanobotu byla zodpovězena typovaným faktem: agent tvrdil, že v config.json presety glm-5.3 a kimi-k2.7-code neexistují a že si je musí uživatel ručně doplnit — přestože config.json je za workspace boundary a nelze ho číst. Uživatel následně ukázal, že presetů má výrazně víc. Nesprávné tvrzení navíc zapsal do knowledge/models.md a musel je opravovat až v další session.
|
||||||
|
|
||||||
|
**Výskyt:** 7× v 7 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `eca5b6fa` 2026-08-29 — Assistant: v config.json nejsou presety glm-5.3 ani kimi-k2.7-code — musíš je ručně doplnit. O dvě zprávy později uživatel pastnul config s presety kimi, kimi27, kimi3, glmi51, glm52, glm53, glm a napsal: hele ty presety si trosku oprav
|
||||||
|
- `websocket:e93b786a-7792-4f0e-97f0-2efe15dc9aed` 2026-08-29 — turns about nanobot daily model use and preset switching: my check -> ok, but no web_fetch of nanobot.wiki docs per SOUL.md rule; claims like stačí ho přidat do configu and quota mechanics stated without doc verification
|
||||||
|
- `websocket:8e293585-f00f-4b72-893d-b9adc6adb1a5` 2026-08-18 — odpověď: Nejpravděpodobnější příčina: Kimi k3 má extrémně dlouhý defaultní CoT … 50k-100k+ tokenů, $1.0 což odpovídá ~100k tokenům — bez jediného ověřovacího tool callu, logy dostupné nejsou
|
||||||
|
- `websocket_2dc073ed` 2026-05-28 — u: pokud se nahraje novy skill je okamzite funkcni? → a: Ne, není okamžitě funkční… musí se runtime restartovat — bez jediného fetche doku; uživatel: a podival si se na nanobot.wiki, mas to primo napsane v SOUL.md. Později session b818067e ověřila ze zdrojáku skills.py opak: načítá se každý turn, restart není potřeba.
|
||||||
|
- `websocket_da4e5a03` 2026-05-29 — u: budes to delat pres sqlite cli nebo pres mcp? → a: MCP v tomto prostředí nemám — nanobot používá vlastní tools, ne MCP servery — bez lookups; opačný závěr už dříve potvrdila dokumentace fetchnutá v session 0df35595 (tools.mcpServers je v nanobotu podporované).
|
||||||
|
- `websocket_88ba0649` 2026-05-28 — u: jaky z techto modelu dava nejvetsi vyznam pro nanobot → a doporučení s typovanými specifikacemi (Lokální inference na nvidia.hell, Kimi 2M tokenů) bez ověření; uživatel musel opravit: vsechny vylistovane modely jsou v cloudu, navic ty od ollama za predplatne.
|
||||||
|
|
||||||
|
**Návrh:** Pokud je config.json nečitelný (safety guard), nikdy ne tvrdit jeho obsah — požádat uživatele o paste relevantní sekce (model_presets). Tvrzení o vlastní konfiguraci vždy označit jako neověřené, dokud není doloženo.
|
||||||
|
|
||||||
|
## f5163 · `retry-after-safety-guard-block` [open/medium]
|
||||||
|
|
||||||
|
After the exec safety guard blocks a command for using an absolute uv path outside the workspace, the agent retries the same or nearly the same command instead of immediately diagnosing the block reason. The correct fix — plain uv from PATH with a relative script path and the workspace working dir — is only found after 1-2 wasted blocked retries, and in one case the guard escalated to refusing repeated workspace-bypass attempts. The root cause is that the bookmark skill doc instructs invoking the script via the absolute path /home/nanobot/.local/bin/uv, which the guard always rejects.
|
||||||
|
|
||||||
|
**Výskyt:** 15× v 11 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket_a2d3186b` 2026-08-31 12:58 — exec with absolute uv path -> ERROR guard, second exec with same absolute uv path -> ERROR guard again, then refusing repeated workspace-bypass attempts, finally plain uv run with relative path -> ok
|
||||||
|
- `websocket_8e51794a` 2026-08-31 13:54 — exec with absolute uv path -> ERROR guard, repeated with identical absolute uv path -> ERROR guard again, then uv run -> ok
|
||||||
|
- `websocket_48d7d0fe` 2026-08-31 13:24 — exec with absolute uv path -> ERROR guard, then uv run with relative path -> ok
|
||||||
|
- `websocket_c62ad7ac` 2026-08-31 19:44 — exec with absolute uv path and --with sqlite-utils -> ERROR guard, repeated same command -> ERROR guard again, then uv run bookmark.py list -> ok
|
||||||
|
- `websocket_0db4c04c` 2026-08-31 20:25 — exec cmd with absolute uv path -> ERROR guard, then plain uv with workdir -> ok
|
||||||
|
- `efb148d7` 2026-08-31 — exec curl api.github.com repos HKUDS nanobot milestones → ERROR safety guard, retried with working_dir → ERROR, retried again nearly identical → ERROR (3×); later contents API blocked twice before finally writing a tmp/ script
|
||||||
|
|
||||||
|
**Návrh:** In skills/bookmark/SKILL.md replace the invocation line that uses the absolute uv path with: uv run skills/bookmark/scripts/bookmark.py (run from the workspace root; never use an absolute uv path, the exec safety guard blocks it). Behaviorally: after any guard block, do not repeat the command; on the first block switch to uv run with a relative script path and the workspace working dir.
|
||||||
|
|
||||||
|
## f2dd0 · `research-loop-past-sufficiency` [open/medium]
|
||||||
|
|
||||||
|
When the user asks whether some information exists in their own records, the agent keeps searching long after the answer is already found. In both occurrences the target (a bookmark in db/bookmark.sqlite) was located early, but the agent then burned 15-25 more grep and exec calls on session JSONL archaeology — greping raw session logs with shell grep, hitting guard blocks on internal-URL detection, retrying with mangled filenames that did not exist, and re-searching stores it had already cleared. The user only wanted a yes/no plus the record, which was available within the first few calls.
|
||||||
|
|
||||||
|
**Výskyt:** 4× v 4 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket_a96b738a` 2026-08-31 13:53 — grep across notes/keep/cml found nothing but the full-workspace grep already matched ZFS; agent then ran roughly 24 further exec grep calls over sessions/*.jsonl, including several guard blocks (internal/private URL detected) and repeated near-identical retries, before finally checking db/bookmark.sqlite where the answer was
|
||||||
|
- `websocket_48d7d0fe` 2026-08-31 13:32 — bookmark found in db/bookmark.sqlite within the first few calls, but the agent continued with roughly 18 more grep/exec calls over session logs and other stores before answering
|
||||||
|
- `10e98a4d` 2026-08-29 — ~11 tool callů (3 web_search, 4 web_fetch, 2 Nominatim) pro jednu adresu kravína; obec odpověděla po 3 fetchech. Self-diagnóza v 692912c4: měl odpověď po 2.-3. fetchi, ale pokračoval v dalších searchích
|
||||||
|
- `bbff61a1` 2026-08-30 — ~12 tool callů nad interpretací byty = bytové jednotky (akebyty.sk, panelák typologie, developerské projekty) než agent dospěl k zjevnému překlepu na bity PZ2/PH2 a odpověděl z jednoho fetche
|
||||||
|
|
||||||
|
**Návrh:** Before searching personal stores, enumerate the candidate stores (notes, keep, wiki, bookmark db, sessions) and check them in order of likelihood, cheapest first. Stop as soon as the sought item is found and answer; never grep raw session JSONL as a search backend, and never retry a guard-blocked command with a cosmetic variation.
|
||||||
|
|
||||||
|
## f2257 · `retry-after-safety-guard-block` [open/medium]
|
||||||
|
|
||||||
|
After the exec safety guard blocks a command, the identical command is retried once more before any diagnosis; only the second block triggers a change of strategy. Wasted turn per occurrence, and the correct relative-path form was already known from earlier sessions.
|
||||||
|
|
||||||
|
**Výskyt:** 18× v 14 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:7bf9be4e` 2026-08-31 — exec with absolute uv path blocked by safety guard, identical retry blocked again, only the third attempt used the relative uv run form
|
||||||
|
- `websocket:58d092bc` 2026-09-01 — bookmark.py add via absolute uv path blocked twice with identical arguments, third attempt with plain uv run succeeded
|
||||||
|
- `websocket:046d5df9` 2026-09-01 — note_capture.py blocked, near-identical retry blocked again, third attempt passed
|
||||||
|
- `websocket_a2d3186b` 2026-08-31 12:58 — exec with absolute uv path -> ERROR guard, second exec with same absolute uv path -> ERROR guard again, then refusing repeated workspace-bypass attempts, finally plain uv run with relative path -> ok
|
||||||
|
- `websocket_8e51794a` 2026-08-31 13:54 — exec with absolute uv path -> ERROR guard, repeated with identical absolute uv path -> ERROR guard again, then uv run -> ok
|
||||||
|
- `websocket_48d7d0fe` 2026-08-31 13:24 — exec with absolute uv path -> ERROR guard, then uv run with relative path -> ok
|
||||||
|
|
||||||
|
**Návrh:** After a safety-guard block, never repeat the command unchanged; the block message names the cause (path outside working dir), so strip absolute paths on the first retry. The recurring trigger is the skill doc itself, see the skill-doc-absolute-path-triggers-guard finding.
|
||||||
|
|
||||||
|
## f9fa6 · `skill-doc-absolute-path-triggers-guard` [open/medium]
|
||||||
|
|
||||||
|
skills/bookmark/SKILL.md documents invocations with the absolute uv binary path, which the exec safety guard hard-blocks. Every session using the bookmark skill by the book starts with 1-2 blocked calls before the agent improvises the relative form. This is the root cause of the guard-block retries in bookmark sessions; the note skill already documents the correct workspace-relative form.
|
||||||
|
|
||||||
|
**Výskyt:** 5× v 3 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:7bf9be4e` 2026-08-31 — two blocked exec calls starting from the documented absolute uv invocation before switching to uv run with a relative script path
|
||||||
|
- `websocket:861ad1f9` 2026-09-01 — bookmark history via absolute uv path blocked once, then rerun as plain uv run succeeded
|
||||||
|
- `websocket:58d092bc` 2026-09-01 — same shape, two blocked calls before the relative form worked
|
||||||
|
|
||||||
|
**Návrh:** Replace all absolute uv and script paths in skills/bookmark/SKILL.md with workspace-relative invocations plus a working_dir note, mirroring the note skill convention. The patch below fixes the main invocation line; lines 44, 45 and 55 of the same file contain the same absolute-path form and need the identical treatment.
|
||||||
|
|
||||||
|
**Patch:** `skills/bookmark/SKILL.md`
|
||||||
|
|
||||||
|
```diff
|
||||||
|
- /home/nanobot/.local/bin/uv run /home/nanobot/.nanobot/workspace/skills/bookmark/scripts/bookmark.py <command> [args]
|
||||||
|
+ uv run skills/bookmark/scripts/bookmark.py <command> [args] (workspace-relative paths with working_dir set to the workspace root; absolute paths are blocked by the exec safety guard)
|
||||||
|
```
|
||||||
|
|
||||||
|
## f663c · `speculation-presented-as-fact` [open/medium]
|
||||||
|
|
||||||
|
Known pattern, new occurrences: unverified numbers about the agent own state and unsourced quantitative claims were presented as facts. The watch-count fabrication cost a full clarification round-trip with the user.
|
||||||
|
|
||||||
|
**Výskyt:** 7× v 5 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:076a6c1c` 2026-09-01 — review summary stated 4 watch findings as fact; grep of findings.jsonl showed 0 records with status watch; agent admitted the number was invented rather than read from the store
|
||||||
|
- `websocket:6f8fcc41` 2026-08-31 — first wood answer presented energy densities and derived Kč/GJ price-per-heat comparisons as facts with no source lookup; the user then used them to justify a 7980 Kč purchase (weaker instance, figures were marked as approximate)
|
||||||
|
- `d542906d` 2026-08-30 — První odpověď bez tool callů tvrdí: extrémní chudoba klesla za 40 let z ~40 % lidstva pod 10 %, ekonomika USA je z ~80 % domácí služby, uhlíková intenzita HDP klesá ~2 % ročně, civilizace spotřebuje ~20 TW vs 170 000 TW slunečního příkonu. Až po námitce uživatele následoval web_search na UN WPP 2024
|
||||||
|
- `websocket:7a131ba2-f227-445b-be5e-6f8d0ad72f34` 2026-08-28 — turn 1 asserts teplota and sliny/lipidy effects as fact; after user pushback the agent fully reverses both; when asked whether it is an estimate or has real evidence the agent answers: je to můj odhad ... nemám pro to ověřený podklad v české legislativě
|
||||||
|
- `websocket:7a131ba2-f227-445b-be5e-6f8d0ad72f34` 2026-08-28 — final answer claims vyhláška 137/2004 Sb. explicitně zakazuje + vlastnictví přechází na zákazníka, sourced only from web_search snippets, no web_fetch of zakonyprolidi.cz or the vyhláška text
|
||||||
|
- `websocket:e93b786a-7792-4f0e-97f0-2efe15dc9aed` 2026-08-29 — Flash spotřebuje ~20× méně kvóty za stejné chytré chování u 90 % tvých úloh — invented numbers, no source
|
||||||
|
|
||||||
|
**Návrh:** Any count or status reported to the user must come from a fresh read of the store in the same turn, not from memory of a previous run. Numbers driving purchase decisions should be sourced or explicitly marked as unverified estimates.
|
||||||
|
|
||||||
|
## f7158 · `diagnosis-without-checking-own-logs-first` [open/medium]
|
||||||
|
|
||||||
|
Known pattern, new occurrences: questions about the agent own records were answered from memory or from the wrong store instead of reading the actual record file first, producing a wrong answer the user had to correct.
|
||||||
|
|
||||||
|
**Výskyt:** 4× v 4 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:1afa1dd8` 2026-09-01 — user asked what the agent knows about wood in project chata; agent answered that no wood notes exist, but projects/chata/memory.md contained the full wood purchase decision written earlier the same morning; user had to insist on reading the own records
|
||||||
|
- `websocket:046d5df9` 2026-09-01 — when locating the wood price conversation, four greps targeted memory/history.jsonl, which holds Dream memory rather than transcripts, before searching sessions/ where the conversation actually lived
|
||||||
|
- `e2abfbf0` 2026-08-29 — Dotaz zjisti proc vytuhly sessions → grep přes workspace + list_dir detach → ERROR not found; uživatel: des na to spatne proc si se nejdriv nepodival do historie?
|
||||||
|
- `692912c4` 2026-08-29 — Agent nejdřív tvrdil, že session logy v nanobot datadiru nejsou přes workspace file tools dostupné; o pár minut později je našel v sessions/ uvnitř workspace a celou analýzu z nich udělal
|
||||||
|
|
||||||
|
**Návrh:** For any question of the form what do you know about X in store Y, read Y before answering; a negative claim (nothing stored) requires the same read as a positive one.
|
||||||
|
|
||||||
|
## f7575 · `skill-doc-absolute-path-triggers-guard` [open/medium]
|
||||||
|
|
||||||
|
skills/bookmark/SKILL.md still documents invocations with the absolute uv binary path, which the exec safety guard hard-blocks. In the bookmark session the agent followed the documented command verbatim, got blocked, and only succeeded after improvising a plain uv invocation with workspace working_dir. Every future session using this skill will hit the same guard block and burn a turn rediscovering the workaround. The same absolute-path form appears in the html_to_markdown and heredoc examples further down the file.
|
||||||
|
|
||||||
|
**Výskyt:** 6× v 4 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:4f712bf0 | 2026-09-01 16:59` 2026-09-01 — exec with absolute uv binary path and absolute script path -> ERROR Command blocked by safety guard (path outside working dir); retried as plain uv run with relative script path and workspace working_dir -> ok
|
||||||
|
- `websocket:7bf9be4e` 2026-08-31 — two blocked exec calls starting from the documented absolute uv invocation before switching to uv run with a relative script path
|
||||||
|
- `websocket:861ad1f9` 2026-09-01 — bookmark history via absolute uv path blocked once, then rerun as plain uv run succeeded
|
||||||
|
- `websocket:58d092bc` 2026-09-01 — same shape, two blocked calls before the relative form worked
|
||||||
|
|
||||||
|
**Návrh:** Replace every absolute uv binary path and absolute script path in the bookmark SKILL.md command examples with plain uv run plus a relative script path, and state explicitly that every command must run with working_dir set to the workspace root because the exec safety guard blocks absolute paths. Audit other skill docs that document CLI invocations for the same absolute-path form. Patch not provid…
|
||||||
|
|
||||||
|
## f4ae4 · `retry-after-safety-guard-block` [open/medium]
|
||||||
|
|
||||||
|
After the exec safety guard blocked a project_cli.py log command, the agent retried near-identical forms without diagnosing the block. Attempt 2 repeated the missing working_dir mistake, and attempt 4 omitted working_dir again even though attempt 3 had already proven that adding working_dir lets the command through. Three guard blocks in one small logging request, plus a confounded test: attempt 3 changed the text to ASCII and added working_dir at the same time, so the variable actually responsible could not be isolated. AGENTS.md already documents that exec commands need an explicit workspac…
|
||||||
|
|
||||||
|
**Výskyt:** 20× v 15 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:6e9b8008 | 2026-09-02 06:22` 2026-09-02 — project_cli.py log life heredoc -> ERROR safety guard; immediate retry with inline text, still no working_dir -> ERROR; third try added working_dir -> ok but argparse error; fourth try with text flag and again no working_dir -> ERROR
|
||||||
|
- `websocket:7bf9be4e` 2026-08-31 — exec with absolute uv path blocked by safety guard, identical retry blocked again, only the third attempt used the relative uv run form
|
||||||
|
- `websocket:58d092bc` 2026-09-01 — bookmark.py add via absolute uv path blocked twice with identical arguments, third attempt with plain uv run succeeded
|
||||||
|
- `websocket:046d5df9` 2026-09-01 — note_capture.py blocked, near-identical retry blocked again, third attempt passed
|
||||||
|
- `websocket_a2d3186b` 2026-08-31 12:58 — exec with absolute uv path -> ERROR guard, second exec with same absolute uv path -> ERROR guard again, then refusing repeated workspace-bypass attempts, finally plain uv run with relative path -> ok
|
||||||
|
- `websocket_8e51794a` 2026-08-31 13:54 — exec with absolute uv path -> ERROR guard, repeated with identical absolute uv path -> ERROR guard again, then uv run -> ok
|
||||||
|
|
||||||
|
**Návrh:** On the first safety-guard block, check for a missing workspace path before retrying, and never re-run a blocked command without changing the suspected cause. Change one variable per test. A short rule in the AGENTS.md exec section (after a block, diagnose working_dir first, do not resend the same form) would cover it.
|
||||||
|
|
||||||
|
## f5c34 · `answer-self-config-from-guesswork` [open/medium] — REGRESE
|
||||||
|
|
||||||
|
A question about the agent own exec safety guard behavior was answered with an invented mechanism stated as fact: the guard blocks diacritics in the command string. The evidence did not support it — the ASCII test attempt also added working_dir, so two variables changed at once and the diacritics conclusion was unfounded. When the user challenged it, the recap partially walked it back but still asserted that diacritics in a command is a suspicious signal for the guard and guessed at guard path-parsing internals. The guard is documented in AGENTS.md (explicit workspace path requirement), which…
|
||||||
|
|
||||||
|
**Výskyt:** 8× v 8 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:6e9b8008 | 2026-09-02 06:22` 2026-09-02 — agent message claims the guard blocks diacritics in the command string because the ASCII version passed; later recap still claims diacritics is a suspicious signal, presumably because the guard parses paths in the command
|
||||||
|
- `eca5b6fa` 2026-08-29 — Assistant: v config.json nejsou presety glm-5.3 ani kimi-k2.7-code — musíš je ručně doplnit. O dvě zprávy později uživatel pastnul config s presety kimi, kimi27, kimi3, glmi51, glm52, glm53, glm a napsal: hele ty presety si trosku oprav
|
||||||
|
- `websocket:e93b786a-7792-4f0e-97f0-2efe15dc9aed` 2026-08-29 — turns about nanobot daily model use and preset switching: my check -> ok, but no web_fetch of nanobot.wiki docs per SOUL.md rule; claims like stačí ho přidat do configu and quota mechanics stated without doc verification
|
||||||
|
- `websocket:8e293585-f00f-4b72-893d-b9adc6adb1a5` 2026-08-18 — odpověď: Nejpravděpodobnější příčina: Kimi k3 má extrémně dlouhý defaultní CoT … 50k-100k+ tokenů, $1.0 což odpovídá ~100k tokenům — bez jediného ověřovacího tool callu, logy dostupné nejsou
|
||||||
|
- `websocket_2dc073ed` 2026-05-28 — u: pokud se nahraje novy skill je okamzite funkcni? → a: Ne, není okamžitě funkční… musí se runtime restartovat — bez jediného fetche doku; uživatel: a podival si se na nanobot.wiki, mas to primo napsane v SOUL.md. Později session b818067e ověřila ze zdrojáku skills.py opak: načítá se každý turn, restart není potřeba.
|
||||||
|
- `websocket_da4e5a03` 2026-05-29 — u: budes to delat pres sqlite cli nebo pres mcp? → a: MCP v tomto prostředí nemám — nanobot používá vlastní tools, ne MCP servery — bez lookups; opačný závěr už dříve potvrdila dokumentace fetchnutá v session 0df35595 (tools.mcpServers je v nanobotu podporované).
|
||||||
|
|
||||||
|
**Návrh:** For questions about own tooling behavior, verify with a controlled test changing a single variable, or check the documented guard rules before answering; state explicitly when the mechanism is unverified. Do not present a confounded one-off observation as the cause.
|
||||||
|
|
||||||
|
## f3373 · `answer-self-config-from-guesswork` [open/low] — REGRESE
|
||||||
|
|
||||||
|
New occurrence of the applied answer-self-config-from-guesswork pattern. When the user asked about running nanobot itself on Flash versus flagship (daily model choice, preset switching, config changes), the agent answered partly from verified state (my check showed model glm-5.3-flash:cloud) but made claims about preset switching mechanics and config modification without the SOUL.md-mandated web_fetch of the nanobot.wiki docs before answering questions about its own functioning, and left the open question about available Kimi presets unresolved while speculating how they could be added.
|
||||||
|
|
||||||
|
**Výskyt:** 6× v 6 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:e93b786a-7792-4f0e-97f0-2efe15dc9aed` 2026-08-29 — turns about nanobot daily model use and preset switching: my check -> ok, but no web_fetch of nanobot.wiki docs per SOUL.md rule; claims like stačí ho přidat do configu and quota mechanics stated without doc verification
|
||||||
|
- `websocket:8e293585-f00f-4b72-893d-b9adc6adb1a5` 2026-08-18 — odpověď: Nejpravděpodobnější příčina: Kimi k3 má extrémně dlouhý defaultní CoT … 50k-100k+ tokenů, $1.0 což odpovídá ~100k tokenům — bez jediného ověřovacího tool callu, logy dostupné nejsou
|
||||||
|
- `websocket_2dc073ed` 2026-05-28 — u: pokud se nahraje novy skill je okamzite funkcni? → a: Ne, není okamžitě funkční… musí se runtime restartovat — bez jediného fetche doku; uživatel: a podival si se na nanobot.wiki, mas to primo napsane v SOUL.md. Později session b818067e ověřila ze zdrojáku skills.py opak: načítá se každý turn, restart není potřeba.
|
||||||
|
- `websocket_da4e5a03` 2026-05-29 — u: budes to delat pres sqlite cli nebo pres mcp? → a: MCP v tomto prostředí nemám — nanobot používá vlastní tools, ne MCP servery — bez lookups; opačný závěr už dříve potvrdila dokumentace fetchnutá v session 0df35595 (tools.mcpServers je v nanobotu podporované).
|
||||||
|
- `websocket_88ba0649` 2026-05-28 — u: jaky z techto modelu dava nejvetsi vyznam pro nanobot → a doporučení s typovanými specifikacemi (Lokální inference na nvidia.hell, Kimi 2M tokenů) bez ověření; uživatel musel opravit: vsechny vylistovane modely jsou v cloudu, navic ty od ollama za predplatne.
|
||||||
|
- `websocket_f6e42993` 2026-05-27 — u: jaky z techto modelu dava nejvetsi smysl pro tvuj beh → a: Qwen 2.5 Coder, ideálně 32B, případně 14B podle VRAM — doporučení pro lokální GPU, přitom běželo Ollama cloud; uživatel opravil: bezi to v ollama cloudu, takze to je asi nejakej nadupanejsi model.
|
||||||
|
|
||||||
|
**Návrh:** When the question is about nanobot configuration or model mechanics, perform the mandated docs fetch before answering, and verify which presets actually exist instead of speculating how to add them.
|
||||||
|
|
||||||
|
## fa59f · `retry-without-diagnosis` [open/low] — REGRESE
|
||||||
|
|
||||||
|
Zkrácený (truncated) fetch byl řešen opakovaným fetchem téhož URL s menším maxChars, což obsah prozradit nemohlo, místo pojmenování režimu selhání (extrakce_useká před metadaty) a změny endpointu. Porušuje existující SOUL pravidlo o dvou zkrácených fetších téhož cíle.
|
||||||
|
|
||||||
|
**Výskyt:** 65× v 5 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `c745618e` 2026-08-29 — web_fetch ollama.com/library/glm-5.3-flash:cloud → ok ale truncated; refetch maxChars 3500 → truncated; refetch maxChars 3000 → truncated; refetch via r.jina.ai 2500 → truncated; refetch freellm.net; teprve šestý pokus (endpoint /tags) přinesl usage tier okamžitě
|
||||||
|
- `websocket:f6e1e265-7a37-451c-ad7a-f601c40fdc5a` 2026-08-28 — web_fetch unix.stackexchange.com/questions/579818 -> ERROR 403 Forbidden, later web_fetch the same URL again -> ERROR 403 Forbidden
|
||||||
|
- `websocket:f6e1e265-7a37-451c-ad7a-f601c40fdc5a` 2026-08-28 — web_search -> ERROR DuckDuckGo search failed (No results found / ConnectError / ConnectTimeout) dozens of times, each followed by another batch of near-identical queries with one keyword swapped
|
||||||
|
- `websocket:ef53ecfb-6aae-42ff-ac6a-64cdb0b849fe` 2026-08-12 — web_fetch api.github.com/repos/open-webui/open-webui/releases/291846033 → ERROR repeated external lookup blocked, opakováno ~35× v prokládání s ~25 téměř identickými web_search dotazy (v0.8.6 changelog full features list …)
|
||||||
|
- `websocket_08a0c453` 2026-05-27 — edit_file → ERROR old_text not found; po re-read agent zopakoval edit_file se stejným old_text → ERROR znovu; teprve poté zjistil, že hodnoty v YAML nejsou v uvozovkách, a upravil argumenty.
|
||||||
|
- `websocket_1a49eb18` 2026-05-27 — read_file(path=skills/remind/SKILL.md) → ok, 89 B, ×3 za sebou se stejnými argumenty (podezřele malý výsledek nebyl diagnostikován), teprve čtvrtý pokyn přes exec cat přinesl plných 4.7 kB.
|
||||||
|
|
||||||
|
**Návrh:** Po dvou zkrácených fetchech téhož URL zastavit, pojmenovat failure mode (markdown extrakce nezahrnuje metadata pod readme) a přepnout na jiný endpoint zdroje (tags endpoint, API), ne měnit jen maxChars.
|
||||||
|
|
||||||
|
## f7b82 · `diagnosis-without-checking-own-logs-first` [open/low]
|
||||||
|
|
||||||
|
Při dotazu na vlastní minulé chování (proč vytuhly sessions) agent nejdřív hledal v nesouvisejících zdrojích (workspace grep, neexistující detach/ adresář) a tvrdil, že session logy nejsou dostupné — přitom sessions/ leží přímo ve workspace a čitelný je i memory/history.jsonl. Uživatel na toto explicitně poukázal.
|
||||||
|
|
||||||
|
**Výskyt:** 2× v 2 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `e2abfbf0` 2026-08-29 — Dotaz zjisti proc vytuhly sessions → grep přes workspace + list_dir detach → ERROR not found; uživatel: des na to spatne proc si se nejdriv nepodival do historie?
|
||||||
|
- `692912c4` 2026-08-29 — Agent nejdřív tvrdil, že session logy v nanobot datadiru nejsou přes workspace file tools dostupné; o pár minut později je našel v sessions/ uvnitř workspace a celou analýzu z nich udělal
|
||||||
|
|
||||||
|
**Návrh:** Pro otázky o vlastním chování Nejprve prohledat sessions/*.jsonl a memory/history.jsonl (obojí ve workspace), teprve potom jiné zdroje; netvrdit nedostupnost, dokud nebyl directory listing workspace proveden.
|
||||||
|
|
||||||
|
## fdbc5 · `speculation-presented-as-fact` [open/low]
|
||||||
|
|
||||||
|
V první odpovědi na ekonomicko-filozofickou otázku bylo několik kvantitativních tvrzení prezentováno jako fakta bez jediného ověřovacího tool callu. Ověřeno bylo jen datum populace — a to až po pushbacku uživatele.
|
||||||
|
|
||||||
|
**Výskyt:** 5× v 3 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `d542906d` 2026-08-30 — První odpověď bez tool callů tvrdí: extrémní chudoba klesla za 40 let z ~40 % lidstva pod 10 %, ekonomika USA je z ~80 % domácí služby, uhlíková intenzita HDP klesá ~2 % ročně, civilizace spotřebuje ~20 TW vs 170 000 TW slunečního příkonu. Až po námitce uživatele následoval web_search na UN WPP 2024
|
||||||
|
- `websocket:7a131ba2-f227-445b-be5e-6f8d0ad72f34` 2026-08-28 — turn 1 asserts teplota and sliny/lipidy effects as fact; after user pushback the agent fully reverses both; when asked whether it is an estimate or has real evidence the agent answers: je to můj odhad ... nemám pro to ověřený podklad v české legislativě
|
||||||
|
- `websocket:7a131ba2-f227-445b-be5e-6f8d0ad72f34` 2026-08-28 — final answer claims vyhláška 137/2004 Sb. explicitně zakazuje + vlastnictví přechází na zákazníka, sourced only from web_search snippets, no web_fetch of zakonyprolidi.cz or the vyhláška text
|
||||||
|
- `websocket:e93b786a-7792-4f0e-97f0-2efe15dc9aed` 2026-08-29 — Flash spotřebuje ~20× méně kvóty za stejné chytré chování u 90 % tvých úloh — invented numbers, no source
|
||||||
|
|
||||||
|
**Návrh:** U diskusních odpovědí s číselnými tvrzeními: buď ověřit přes web_search před odpovědí, nebo explicitně označit jako neověřený odhad z paměti (bez ohledu na to, že jde o obecně známá čísla).
|
||||||
|
|
||||||
|
## f2b3d · `retry-without-diagnosis` [open/low] — REGRESE
|
||||||
|
|
||||||
|
Known pattern, new occurrences in this slice: an unhelpful or blocked fetch is answered by refetching the same target with a smaller maxChars or a sibling URL of the same blocked site, instead of naming the failure mode and changing source.
|
||||||
|
|
||||||
|
**Výskyt:** 67× v 7 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:6f8fcc41` 2026-08-31 — naradi-extol.cz fetched with maxChars 5000, spec table did not render, same URL refetched with extractMode text and maxChars 4000 — identical target, smaller budget, no strategy change
|
||||||
|
- `websocket:41eaf5b3` 2026-08-31 — after a 403 on vseinstrumenti.ru reviews page, another vseinstrumenti.ru page was fetched and returned 403 again; several marketplace pages returned 300-600 B degenerate outputs without the block mode being named
|
||||||
|
- `c745618e` 2026-08-29 — web_fetch ollama.com/library/glm-5.3-flash:cloud → ok ale truncated; refetch maxChars 3500 → truncated; refetch maxChars 3000 → truncated; refetch via r.jina.ai 2500 → truncated; refetch freellm.net; teprve šestý pokus (endpoint /tags) přinesl usage tier okamžitě
|
||||||
|
- `websocket:f6e1e265-7a37-451c-ad7a-f601c40fdc5a` 2026-08-28 — web_fetch unix.stackexchange.com/questions/579818 -> ERROR 403 Forbidden, later web_fetch the same URL again -> ERROR 403 Forbidden
|
||||||
|
- `websocket:f6e1e265-7a37-451c-ad7a-f601c40fdc5a` 2026-08-28 — web_search -> ERROR DuckDuckGo search failed (No results found / ConnectError / ConnectTimeout) dozens of times, each followed by another batch of near-identical queries with one keyword swapped
|
||||||
|
- `websocket:ef53ecfb-6aae-42ff-ac6a-64cdb0b849fe` 2026-08-12 — web_fetch api.github.com/repos/open-webui/open-webui/releases/291846033 → ERROR repeated external lookup blocked, opakováno ~35× v prokládání s ~25 téměř identickými web_search dotazy (v0.8.6 changelog full features list …)
|
||||||
|
|
||||||
|
**Návrh:** The two-fetch stop gate was applied to SOUL.md on 2026-09-01 (commit 540c599); these sessions predate it. No new rule needed, but the refetch-with-smaller-maxChars variant is worth including when the next reflect_auto run re-checks this pattern.
|
||||||
|
|
||||||
|
## f78a0 · `multi-step-plan-then-turn-end` [watch/medium]
|
||||||
|
|
||||||
|
When the user explicitly requested deep research, the agent emitted only a research plan (a list of 5 sub-questions) and ended the turn without a single tool call. The user saw a dead conversation, assumed work was running, and waited tens of minutes. The research only started in the next turn after the user asked how it went. The agent then needed three rounds of user feedback to converge on the correct behavioral rule (say you are starting, and actually start in the same turn).
|
||||||
|
|
||||||
|
**Výskyt:** 1× v 1 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket_a3058576` 2026-08-31 19:04 — user asked for deep research; assistant replied with only the plan of 5 sub-questions and ended the turn with zero tool calls; user asked how it went; only then did roughly 40 web_search/web_fetch calls run; user said he waited tens of minutes for nothing; it took 3 correction rounds to write the right rule into keep.md
|
||||||
|
|
||||||
|
**Návrh:** After presenting a plan for a task the user already explicitly requested, execute it in the same turn — or, if execution is deferred, say so explicitly. A plan alone must never be the last message of a turn.
|
||||||
|
|
||||||
|
## f1768 · `system-python-instead-of-uv` [watch/low]
|
||||||
|
|
||||||
|
Navzdory konvenci uv v AGENTS.md (sekce python — use uv, včetně explicitního příkladu uv run --with pkg python -c) agent používal systémový python3 -c. V jednom případě to vedlo přímo ke dvěma marným blokům safety guardem, v druhém případě parsoval JSON z PyPI přes python3 -c v pipe s curl, i když šlo použít uv.
|
||||||
|
|
||||||
|
**Výskyt:** 5× v 4 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:ef53ecfb-6aae-42ff-ac6a-64cdb0b849fe` 2026-08-12 — exec python3 -c (čtení tool-result souboru) → ERROR blocked ×2, systémový python místo uv
|
||||||
|
- `websocket:131a0791-ff41-4731-bf22-898089bb3133` 2026-08-26 — exec curl -s https://pypi.org/pypi/nanobot-ai/json | python3 -c (parsování verzí) → ok, místo uv run --with
|
||||||
|
- `websocket_f6e42993` 2026-05-27 — exec: curl -s http://nvidia.hell:11434/api/tags | python3 -c … — systémový python3 v pipe (call sice zablokovala URL guard, ale python3 zůstává v použití).
|
||||||
|
- `websocket_3d549532` 2026-05-28 — exec: cat .nanobot/tool-results/… | python3 -c import json,sys… — úspěšný run přes systémový python3 místo uv run python -c.
|
||||||
|
|
||||||
|
**Návrh:** Pravidlo i příklad už v AGENTS.md existují, jde o opakované porušení. Případně doplnit do sekce krátkou poznámku, že python3 -c v pipe (curl | python3) je také zakázané.
|
||||||
|
|
||||||
|
## f019a · `system-python-instead-of-uv` [watch/low]
|
||||||
|
|
||||||
|
New occurrence of the rejected system-python-instead-of-uv pattern. A Python one-liner was run via python3 -c in exec, violating the uv convention in AGENTS.md. The command was additionally blocked by the safety guard, after which the agent correctly recovered by writing a script and running it with uv run — but the initial choice still wasted a turn.
|
||||||
|
|
||||||
|
**Výskyt:** 6× v 5 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:e93b786a-7792-4f0e-97f0-2efe15dc9aed` 2026-08-29 — exec python3 -c with json parsing of history.jsonl -> ERROR Command blocked by safety guard; next calls correctly use write_file tmp/history_scan.py + uv run tmp/history_scan.py
|
||||||
|
- `websocket:ef53ecfb-6aae-42ff-ac6a-64cdb0b849fe` 2026-08-12 — exec python3 -c (čtení tool-result souboru) → ERROR blocked ×2, systémový python místo uv
|
||||||
|
- `websocket:131a0791-ff41-4731-bf22-898089bb3133` 2026-08-26 — exec curl -s https://pypi.org/pypi/nanobot-ai/json | python3 -c (parsování verzí) → ok, místo uv run --with
|
||||||
|
- `websocket_f6e42993` 2026-05-27 — exec: curl -s http://nvidia.hell:11434/api/tags | python3 -c … — systémový python3 v pipe (call sice zablokovala URL guard, ale python3 zůstává v použití).
|
||||||
|
- `websocket_3d549532` 2026-05-28 — exec: cat .nanobot/tool-results/… | python3 -c import json,sys… — úspěšný run přes systémový python3 místo uv run python -c.
|
||||||
|
|
||||||
|
**Návrh:** Default to writing a short script under tmp/ and running it with uv run, never python3 -c, per AGENTS.md.
|
||||||
|
|
||||||
|
## f332b · `system-python-instead-of-uv` [watch/low]
|
||||||
|
|
||||||
|
Přes explicitní AGENTS.md konvenci (vše přes uv, ne systémový python) se objevil pokus o python3 -c one-liner. Příkaz sice stejně zablokoval safety guard, ale záměr konvenci porušoval.
|
||||||
|
|
||||||
|
**Výskyt:** 7× v 6 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `695fd33b` 2026-08-29 — exec python3 -c s unicodedata snippetem pro analýzu znaků v models.md → ERROR safety guard; správná cesta (write_file do tmp/ + uv run) následovala až o dva pokusy později
|
||||||
|
- `websocket:e93b786a-7792-4f0e-97f0-2efe15dc9aed` 2026-08-29 — exec python3 -c with json parsing of history.jsonl -> ERROR Command blocked by safety guard; next calls correctly use write_file tmp/history_scan.py + uv run tmp/history_scan.py
|
||||||
|
- `websocket:ef53ecfb-6aae-42ff-ac6a-64cdb0b849fe` 2026-08-12 — exec python3 -c (čtení tool-result souboru) → ERROR blocked ×2, systémový python místo uv
|
||||||
|
- `websocket:131a0791-ff41-4731-bf22-898089bb3133` 2026-08-26 — exec curl -s https://pypi.org/pypi/nanobot-ai/json | python3 -c (parsování verzí) → ok, místo uv run --with
|
||||||
|
- `websocket_f6e42993` 2026-05-27 — exec: curl -s http://nvidia.hell:11434/api/tags | python3 -c … — systémový python3 v pipe (call sice zablokovala URL guard, ale python3 zůstává v použití).
|
||||||
|
- `websocket_3d549532` 2026-05-28 — exec: cat .nanobot/tool-results/… | python3 -c import json,sys… — úspěšný run přes systémový python3 místo uv run python -c.
|
||||||
|
|
||||||
|
**Návrh:** Všechny inline snippety spouštět přes uv run python -c nebo jako tmp/ skript; systémový python3 nepoužívat ani zkoušet.
|
||||||
|
|
||||||
|
## f5514 · `system-python-instead-of-uv` [watch/low]
|
||||||
|
|
||||||
|
Known watch pattern, one new occurrence: a python3 -c one-liner was used in an exec pipe despite the AGENTS.md uv convention.
|
||||||
|
|
||||||
|
**Výskyt:** 8× v 7 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:d553afcc` 2026-08-31 — tail -20 memory/history.jsonl piped into python3 -c for JSON parsing of session records
|
||||||
|
- `695fd33b` 2026-08-29 — exec python3 -c s unicodedata snippetem pro analýzu znaků v models.md → ERROR safety guard; správná cesta (write_file do tmp/ + uv run) následovala až o dva pokusy později
|
||||||
|
- `websocket:e93b786a-7792-4f0e-97f0-2efe15dc9aed` 2026-08-29 — exec python3 -c with json parsing of history.jsonl -> ERROR Command blocked by safety guard; next calls correctly use write_file tmp/history_scan.py + uv run tmp/history_scan.py
|
||||||
|
- `websocket:ef53ecfb-6aae-42ff-ac6a-64cdb0b849fe` 2026-08-12 — exec python3 -c (čtení tool-result souboru) → ERROR blocked ×2, systémový python místo uv
|
||||||
|
- `websocket:131a0791-ff41-4731-bf22-898089bb3133` 2026-08-26 — exec curl -s https://pypi.org/pypi/nanobot-ai/json | python3 -c (parsování verzí) → ok, místo uv run --with
|
||||||
|
- `websocket_f6e42993` 2026-05-27 — exec: curl -s http://nvidia.hell:11434/api/tags | python3 -c … — systémový python3 v pipe (call sice zablokovala URL guard, ale python3 zůstává v použití).
|
||||||
|
|
||||||
|
**Návrh:** No patch needed; the AGENTS.md convention exists. Worth keeping on watch since the slip happened inside a session that was itself about mining past mistakes.
|
||||||
|
|
||||||
|
## fc317 · `exec-append-instead-of-file-tools` [watch/low]
|
||||||
|
|
||||||
|
Appends to project markdown files were done via exec cat with a heredoc instead of file tools, contrary to the tool contract that exec must not be a workaround for file operations. The second such append was blocked by the safety guard, wasting a turn before the agent switched to apply_patch, which it could have used from the start. The same heredoc form is prescribed by the project skill doc, so the skill doc is steering future sessions into the same trap.
|
||||||
|
|
||||||
|
**Výskyt:** 2× v 1 session · poprvé 2026-09-02, naposledy 2026-09-02
|
||||||
|
|
||||||
|
**Důkazy:**
|
||||||
|
- `websocket:607b50b3 | 2026-09-01 14:45` 2026-09-01 — exec cat append to projects/proxmox/memory.md -> ok; later exec cat append to projects/proxmox/state.md -> ERROR blocked by safety guard, then redone via apply_patch
|
||||||
|
|
||||||
|
**Návrh:** Use apply_patch or edit_file for all file appends and edits; reserve exec for actual process execution. Separately, update the project SKILL.md to stop documenting heredoc-based log and file writes that trip the guard — point to the text flag or stdin from a tmp file with working_dir set instead.
|
||||||
|
|
||||||
40
scripts/hn_top.ts
Normal file
40
scripts/hn_top.ts
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/env bun
|
||||||
|
/**
|
||||||
|
* Fetches top stories from Hacker News API and prints title + URL + score.
|
||||||
|
* Usage: bun run scripts/hn_top.ts [limit]
|
||||||
|
*/
|
||||||
|
|
||||||
|
const limit = Number(Bun.argv[2] ?? 10);
|
||||||
|
|
||||||
|
interface HNItem {
|
||||||
|
id: number;
|
||||||
|
title?: string;
|
||||||
|
url?: string;
|
||||||
|
score?: number;
|
||||||
|
by?: string;
|
||||||
|
type?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const BASE = "https://hacker-news.firebaseio.com/v0";
|
||||||
|
|
||||||
|
async function fetchJSON<T>(url: string): Promise<T> {
|
||||||
|
const res = await fetch(url);
|
||||||
|
if (!res.ok) throw new Error(`HTTP ${res.status} for ${url}`);
|
||||||
|
return res.json() as Promise<T>;
|
||||||
|
}
|
||||||
|
|
||||||
|
const ids = await fetchJSON<number[]>(`${BASE}/topstories.json`);
|
||||||
|
const top = ids.slice(0, limit);
|
||||||
|
|
||||||
|
const items = await Promise.all(
|
||||||
|
top.map((id) => fetchJSON<HNItem>(`${BASE}/item/${id}.json`)),
|
||||||
|
);
|
||||||
|
|
||||||
|
for (const item of items) {
|
||||||
|
if (item.type !== "story" || !item.title) continue;
|
||||||
|
const score = item.score ?? 0;
|
||||||
|
const url = item.url ?? "(no url)";
|
||||||
|
console.log(`[${score}↑] ${item.title}`);
|
||||||
|
console.log(` ${url}`);
|
||||||
|
console.log();
|
||||||
|
}
|
||||||
@@ -2,7 +2,8 @@
|
|||||||
"""Parse the ollama library page text dump and list unique models."""
|
"""Parse the ollama library page text dump and list unique models."""
|
||||||
import re, json, sys
|
import re, json, sys
|
||||||
|
|
||||||
raw = open('scripts/ollama_library_full.txt').read()
|
with open('scripts/ollama_library_full.txt', encoding='utf-8') as f:
|
||||||
|
raw = f.read()
|
||||||
first_line = raw.split('\n')[0]
|
first_line = raw.split('\n')[0]
|
||||||
# Each line is prefixed "N| " repeated; find the first { and the last }
|
# Each line is prefixed "N| " repeated; find the first { and the last }
|
||||||
start = first_line.find('{')
|
start = first_line.find('{')
|
||||||
|
|||||||
0
triggers/.lock
Normal file
0
triggers/.lock
Normal file
Reference in New Issue
Block a user