instar 0.28.49 → 0.28.51

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/commands/init.js +93 -93
  2. package/dist/commands/init.js.map +1 -1
  3. package/dist/commands/server.d.ts.map +1 -1
  4. package/dist/commands/server.js +61 -31
  5. package/dist/commands/server.js.map +1 -1
  6. package/dist/core/InputGuard.d.ts +29 -3
  7. package/dist/core/InputGuard.d.ts.map +1 -1
  8. package/dist/core/InputGuard.js +73 -45
  9. package/dist/core/InputGuard.js.map +1 -1
  10. package/dist/core/PostUpdateMigrator.d.ts +14 -0
  11. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  12. package/dist/core/PostUpdateMigrator.js +46 -0
  13. package/dist/core/PostUpdateMigrator.js.map +1 -1
  14. package/dist/messaging/shared/isSystemOrProxyMessage.d.ts +41 -0
  15. package/dist/messaging/shared/isSystemOrProxyMessage.d.ts.map +1 -0
  16. package/dist/messaging/shared/isSystemOrProxyMessage.js +64 -0
  17. package/dist/messaging/shared/isSystemOrProxyMessage.js.map +1 -0
  18. package/dist/monitoring/PresenceProxy.d.ts +3 -1
  19. package/dist/monitoring/PresenceProxy.d.ts.map +1 -1
  20. package/dist/monitoring/PresenceProxy.js +5 -16
  21. package/dist/monitoring/PresenceProxy.js.map +1 -1
  22. package/package.json +1 -1
  23. package/scripts/pre-push-gate.js +6 -3
  24. package/src/data/builtin-manifest.json +43 -43
  25. package/upgrades/0.28.50.md +59 -0
  26. package/upgrades/0.28.51.md +31 -0
  27. package/upgrades/0.28.52.md +82 -0
  28. package/upgrades/side-effects/0.28.49.md +90 -0
  29. package/upgrades/side-effects/0.28.50.md +104 -0
  30. package/upgrades/side-effects/0.28.51.md +145 -0
  31. package/upgrades/side-effects/0.28.52.md +276 -0
  32. package/upgrades/side-effects/pre-push-gate-ci-scope.md +104 -0
  33. package/upgrades/side-effects/skill-port-dynamic-resolution.md +104 -0
@@ -1164,7 +1164,7 @@ Your identity is not fixed at creation. It grows through experience. As you work
1164
1164
  - Jobs: \`.instar/jobs.json\`
1165
1165
  - Users: \`.instar/users.json\`
1166
1166
  - Server: \`instar server start\` (port ${port})
1167
- - Status: \`curl http://localhost:${port}/health\`
1167
+ - Status: \`curl http://localhost:\${INSTAR_PORT:-${port}}/health\`
1168
1168
 
1169
1169
  ### Reporting Issues & Feedback (IMPORTANT — Read This First)
1170
1170
 
@@ -1173,7 +1173,7 @@ Your identity is not fixed at creation. It grows through experience. As you work
1173
1173
  When something isn't working with instar, or the user wants a feature, use your feedback API:
1174
1174
 
1175
1175
  \`\`\`bash
1176
- curl -X POST http://localhost:${port}/feedback \\
1176
+ curl -X POST http://localhost:\${INSTAR_PORT:-${port}}/feedback \\
1177
1177
  -H 'Content-Type: application/json' \\
1178
1178
  -d '{"type":"bug","title":"Short description","description":"Full details with context"}'
1179
1179
  \`\`\`
@@ -1181,21 +1181,21 @@ curl -X POST http://localhost:${port}/feedback \\
1181
1181
  This routes feedback to the Instar maintainers automatically. Valid types: \`bug\`, \`feature\`, \`improvement\`, \`question\`, \`hallucination\`.
1182
1182
 
1183
1183
  **NEVER use \`gh issue\`, \`gh api\`, or GitHub CLI to file issues.** The feedback API is your channel.
1184
- - View submitted feedback: \`curl http://localhost:${port}/feedback\`
1185
- - Retry failed forwards: \`curl -X POST http://localhost:${port}/feedback/retry\`
1184
+ - View submitted feedback: \`curl http://localhost:\${INSTAR_PORT:-${port}}/feedback\`
1185
+ - Retry failed forwards: \`curl -X POST http://localhost:\${INSTAR_PORT:-${port}}/feedback/retry\`
1186
1186
 
1187
1187
  ### What You Have (Capabilities)
1188
1188
 
1189
1189
  **Feedback System** — Report bugs, request features, suggest improvements. All via \`POST /feedback\`. NOT GitHub.
1190
1190
 
1191
1191
  **Job Scheduler** — Run tasks on a schedule. Jobs are defined in \`.instar/jobs.json\`.
1192
- - View jobs: \`curl http://localhost:${port}/jobs\`
1193
- - Trigger a job: \`curl -X POST http://localhost:${port}/jobs/SLUG/trigger\`
1192
+ - View jobs: \`curl http://localhost:\${INSTAR_PORT:-${port}}/jobs\`
1193
+ - Trigger a job: \`curl -X POST http://localhost:\${INSTAR_PORT:-${port}}/jobs/SLUG/trigger\`
1194
1194
  - **Create new jobs**: Edit \`.instar/jobs.json\`. Each job has a slug, schedule (cron), priority, and either a prompt (Claude session), script (shell command), or skill.
1195
1195
 
1196
1196
  **Sessions** — Spawn and manage Claude Code sessions.
1197
- - List: \`curl http://localhost:${port}/sessions\`
1198
- - Spawn: \`curl -X POST http://localhost:${port}/sessions/spawn -H 'Content-Type: application/json' -d '{"name":"task","prompt":"do something"}'\`
1197
+ - List: \`curl http://localhost:\${INSTAR_PORT:-${port}}/sessions\`
1198
+ - Spawn: \`curl -X POST http://localhost:\${INSTAR_PORT:-${port}}/sessions/spawn -H 'Content-Type: application/json' -d '{"name":"task","prompt":"do something"}'\`
1199
1199
 
1200
1200
  **Scripts** — Create shell/python scripts in \`.claude/scripts/\` for reusable capabilities.
1201
1201
 
@@ -1226,7 +1226,7 @@ Skills compound over time. Each one makes future sessions more capable. You are
1226
1226
  Before EVER saying "I don't have", "I can't", or "this isn't available" — check what actually exists:
1227
1227
 
1228
1228
  \`\`\`bash
1229
- curl http://localhost:${port}/capabilities
1229
+ curl http://localhost:\${INSTAR_PORT:-${port}}/capabilities
1230
1230
  \`\`\`
1231
1231
 
1232
1232
  This returns your full capability matrix: scripts, hooks, Telegram status, jobs, relationships, and more. It is the source of truth about what you can do. **Never hallucinate about missing capabilities — verify first.**
@@ -1287,7 +1287,7 @@ Instar has a built-in feedback loop. When something isn't working, your user can
1287
1287
 
1288
1288
  **A rising tide lifts all ships** — every user's feedback improves the platform for everyone. Updates are applied automatically.
1289
1289
 
1290
- - Report: \`curl -X POST http://localhost:${port}/feedback -d '{"issue":"description","context":"relevant logs"}'\`
1290
+ - Report: \`curl -X POST http://localhost:\${INSTAR_PORT:-${port}}/feedback -d '{"issue":"description","context":"relevant logs"}'\`
1291
1291
  - Check updates: \`npm outdated -g instar\`
1292
1292
 
1293
1293
  ### Evolution System
@@ -1295,27 +1295,27 @@ Instar has a built-in feedback loop. When something isn't working, your user can
1295
1295
  You have a built-in evolution system with four subsystems. This is not a metaphor — it's infrastructure that tracks your growth.
1296
1296
 
1297
1297
  **Evolution Queue** — Staged self-improvement proposals.
1298
- - View: \`curl http://localhost:${port}/evolution/proposals\`
1298
+ - View: \`curl http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals\`
1299
1299
  - Propose: \`/evolve\` skill or \`POST /evolution/proposals\`
1300
1300
  - The \`evolution-review\` job evaluates and implements proposals every 6 hours.
1301
1301
 
1302
1302
  **Learning Registry** — Structured, searchable insights.
1303
- - View: \`curl http://localhost:${port}/evolution/learnings\`
1303
+ - View: \`curl http://localhost:\${INSTAR_PORT:-${port}}/evolution/learnings\`
1304
1304
  - Record: \`/learn\` skill or \`POST /evolution/learnings\`
1305
1305
  - The \`insight-harvest\` job synthesizes patterns into proposals every 8 hours.
1306
1306
 
1307
1307
  **Capability Gaps** — Track what you're missing.
1308
- - View: \`curl http://localhost:${port}/evolution/gaps\`
1308
+ - View: \`curl http://localhost:\${INSTAR_PORT:-${port}}/evolution/gaps\`
1309
1309
  - Report: \`/gaps\` skill or \`POST /evolution/gaps\`
1310
1310
 
1311
1311
  **Action Queue** — Commitments with follow-through tracking.
1312
- - View: \`curl http://localhost:${port}/evolution/actions\`
1312
+ - View: \`curl http://localhost:\${INSTAR_PORT:-${port}}/evolution/actions\`
1313
1313
  - Create: \`/commit-action\` skill or \`POST /evolution/actions\`
1314
1314
  - The \`commitment-check\` job surfaces overdue items every 4 hours.
1315
1315
 
1316
1316
  **Dashboard** — Full evolution health:
1317
1317
  \`\`\`bash
1318
- curl http://localhost:${port}/evolution
1318
+ curl http://localhost:\${INSTAR_PORT:-${port}}/evolution
1319
1319
  \`\`\`
1320
1320
 
1321
1321
  **Skills:** \`/evolve\`, \`/learn\`, \`/gaps\`, \`/commit-action\`
@@ -1367,7 +1367,7 @@ Propose an evolution improvement. Use this when you identify something about you
1367
1367
  4. **Submit the proposal**:
1368
1368
 
1369
1369
  \`\`\`bash
1370
- curl -s -X POST http://localhost:${port}/evolution/proposals \\
1370
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals \\
1371
1371
  -H 'Content-Type: application/json' \\
1372
1372
  -d '{"title":"TITLE","source":"WHERE_YOU_NOTICED","description":"WHAT_AND_WHY","type":"TYPE","impact":"medium","effort":"medium"}'
1373
1373
  \`\`\`
@@ -1375,7 +1375,7 @@ curl -s -X POST http://localhost:${port}/evolution/proposals \\
1375
1375
  5. **Check the dashboard** for context:
1376
1376
 
1377
1377
  \`\`\`bash
1378
- curl -s http://localhost:${port}/evolution
1378
+ curl -s http://localhost:\${INSTAR_PORT:-${port}}/evolution
1379
1379
  \`\`\`
1380
1380
 
1381
1381
  ## When to Use
@@ -1413,7 +1413,7 @@ Record a learning or insight. Use this when you discover something worth remembe
1413
1413
  4. **Submit**:
1414
1414
 
1415
1415
  \`\`\`bash
1416
- curl -s -X POST http://localhost:${port}/evolution/learnings \\
1416
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/evolution/learnings \\
1417
1417
  -H 'Content-Type: application/json' \\
1418
1418
  -d '{"title":"TITLE","category":"CATEGORY","description":"FULL_INSIGHT","source":{"discoveredAt":"DATE","platform":"WHERE","session":"SESSION_ID"},"tags":["tag1","tag2"]}'
1419
1419
  \`\`\`
@@ -1467,7 +1467,7 @@ Report a capability gap. Use this when you discover something you should be able
1467
1467
  6. **Submit**:
1468
1468
 
1469
1469
  \`\`\`bash
1470
- curl -s -X POST http://localhost:${port}/evolution/gaps \\
1470
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/evolution/gaps \\
1471
1471
  -H 'Content-Type: application/json' \\
1472
1472
  -d '{"title":"TITLE","category":"CATEGORY","severity":"medium","description":"WHAT_IS_MISSING","context":"WHEN_DID_YOU_NOTICE","currentState":"CURRENT_WORKAROUND","proposedSolution":"HOW_TO_FIX"}'
1473
1473
  \`\`\`
@@ -1483,7 +1483,7 @@ curl -s -X POST http://localhost:${port}/evolution/gaps \\
1483
1483
  ## View Current Gaps
1484
1484
 
1485
1485
  \`\`\`bash
1486
- curl -s http://localhost:${port}/evolution/gaps
1486
+ curl -s http://localhost:\${INSTAR_PORT:-${port}}/evolution/gaps
1487
1487
  \`\`\`
1488
1488
  `,
1489
1489
  },
@@ -1510,7 +1510,7 @@ Create a tracked action item. Use this when you promise to do something, identif
1510
1510
  5. **Submit**:
1511
1511
 
1512
1512
  \`\`\`bash
1513
- curl -s -X POST http://localhost:${port}/evolution/actions \\
1513
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/evolution/actions \\
1514
1514
  -H 'Content-Type: application/json' \\
1515
1515
  -d '{"title":"TITLE","description":"WHAT_TO_DO","priority":"medium","dueBy":"2026-03-01T00:00:00Z","commitTo":"WHO_OR_WHAT","tags":["tag1"]}'
1516
1516
  \`\`\`
@@ -1518,7 +1518,7 @@ curl -s -X POST http://localhost:${port}/evolution/actions \\
1518
1518
  6. **When complete**, mark it done:
1519
1519
 
1520
1520
  \`\`\`bash
1521
- curl -s -X PATCH http://localhost:${port}/evolution/actions/ACT-XXX \\
1521
+ curl -s -X PATCH http://localhost:\${INSTAR_PORT:-${port}}/evolution/actions/ACT-XXX \\
1522
1522
  -H 'Content-Type: application/json' \\
1523
1523
  -d '{"status":"completed","resolution":"What was done"}'
1524
1524
  \`\`\`
@@ -1535,10 +1535,10 @@ curl -s -X PATCH http://localhost:${port}/evolution/actions/ACT-XXX \\
1535
1535
 
1536
1536
  \`\`\`bash
1537
1537
  # All pending actions
1538
- curl -s http://localhost:${port}/evolution/actions?status=pending
1538
+ curl -s http://localhost:\${INSTAR_PORT:-${port}}/evolution/actions?status=pending
1539
1539
 
1540
1540
  # Overdue actions
1541
- curl -s http://localhost:${port}/evolution/actions/overdue
1541
+ curl -s http://localhost:\${INSTAR_PORT:-${port}}/evolution/actions/overdue
1542
1542
  \`\`\`
1543
1543
 
1544
1544
  ## The Commitment Check
@@ -1563,7 +1563,7 @@ You have a built-in feedback system. When something isn't working, is missing, o
1563
1563
  ## Quick Submit
1564
1564
 
1565
1565
  \`\`\`bash
1566
- curl -s -X POST http://localhost:${port}/feedback \\
1566
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/feedback \\
1567
1567
  -H 'Content-Type: application/json' \\
1568
1568
  -d '{
1569
1569
  "type": "bug",
@@ -1611,10 +1611,10 @@ Include enough context for a fix:
1611
1611
 
1612
1612
  \`\`\`bash
1613
1613
  # View submitted feedback
1614
- curl -s http://localhost:${port}/feedback | python3 -m json.tool
1614
+ curl -s http://localhost:\${INSTAR_PORT:-${port}}/feedback | python3 -m json.tool
1615
1615
 
1616
1616
  # Retry failed forwards
1617
- curl -s -X POST http://localhost:${port}/feedback/retry
1617
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/feedback/retry
1618
1618
  \`\`\`
1619
1619
 
1620
1620
  ## How It Works
@@ -1657,13 +1657,13 @@ If no findings exist, report "No pending findings" and stop.
1657
1657
  3. **Assess each valid finding**:
1658
1658
  - Is it actionable? Does it describe a real issue or improvement?
1659
1659
  - Is it a duplicate of something already proposed?
1660
- - Check existing evolution proposals: \\\`curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/evolution/proposals\\\`
1660
+ - Check existing evolution proposals: \\\`curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals\\\`
1661
1661
 
1662
1662
  4. **Route the finding** (one of):
1663
1663
 
1664
1664
  **a. Promote to Evolution proposal** (for actionable findings):
1665
1665
  \\\`\\\`\\\`bash
1666
- curl -s -X POST http://localhost:${port}/evolution/proposals \\\\
1666
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals \\\\
1667
1667
  -H "Authorization: Bearer $AUTH" \\\\
1668
1668
  -H 'Content-Type: application/json' \\\\
1669
1669
  -d '{"title":"FINDING_TITLE","source":"serendipity:FINDING_ID","description":"FINDING_DESCRIPTION","type":"TYPE","impact":"IMPACT","effort":"EFFORT","tags":["serendipity","from-subagent"]}'
@@ -1675,7 +1675,7 @@ If no findings exist, report "No pending findings" and stop.
1675
1675
  **c. Flag for manual review** (for findings you're uncertain about):
1676
1676
  Queue an attention item:
1677
1677
  \\\`\\\`\\\`bash
1678
- curl -s -X POST http://localhost:${port}/attention \\\\
1678
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/attention \\\\
1679
1679
  -H "Authorization: Bearer $AUTH" \\\\
1680
1680
  -H 'Content-Type: application/json' \\\\
1681
1681
  -d '{"title":"Serendipity finding needs review: TITLE","body":"DESCRIPTION","priority":"low","source":"serendipity"}'
@@ -1755,7 +1755,7 @@ cat .instar/soul.md
1755
1755
 
1756
1756
  2. **Review recent experience** — Check for identity-relevant learnings:
1757
1757
  \\\`\\\`\\\`bash
1758
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/evolution/learnings?applied=false
1758
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/evolution/learnings?applied=false
1759
1759
  \\\`\\\`\\\`
1760
1760
 
1761
1761
  3. **Ask yourself these questions** (not all will apply every time):
@@ -1772,7 +1772,7 @@ curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/evolution/lear
1772
1772
 
1773
1773
  4. **Update soul.md** — For each section that needs updating:
1774
1774
  \\\`\\\`\\\`bash
1775
- curl -s -X PATCH http://localhost:${port}/identity/soul \\\\
1775
+ curl -s -X PATCH http://localhost:\${INSTAR_PORT:-${port}}/identity/soul \\\\
1776
1776
  -H 'Content-Type: application/json' \\\\
1777
1777
  -H "Authorization: Bearer $AUTH" \\\\
1778
1778
  -d '{"section":"SECTION","operation":"append|replace","content":"YOUR_CONTENT","source":"reflect-skill"}'
@@ -1782,7 +1782,7 @@ curl -s -X PATCH http://localhost:${port}/identity/soul \\\\
1782
1782
 
1783
1783
  5. **Version it** — If you made meaningful changes, update the Evolution History:
1784
1784
  \\\`\\\`\\\`bash
1785
- curl -s -X PATCH http://localhost:${port}/identity/soul \\\\
1785
+ curl -s -X PATCH http://localhost:\${INSTAR_PORT:-${port}}/identity/soul \\\\
1786
1786
  -H 'Content-Type: application/json' \\\\
1787
1787
  -H "Authorization: Bearer $AUTH" \\\\
1788
1788
  -d '{"section":"evolution-history","operation":"append","content":"| X.X | DATE | What changed |","source":"reflect-skill"}'
@@ -1790,7 +1790,7 @@ curl -s -X PATCH http://localhost:${port}/identity/soul \\\\
1790
1790
 
1791
1791
  6. **Check drift** — See how far you've come from your initial state:
1792
1792
  \\\`\\\`\\\`bash
1793
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/identity/soul/drift
1793
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/identity/soul/drift
1794
1794
  \\\`\\\`\\\`
1795
1795
 
1796
1796
  ## When to Use
@@ -1839,7 +1839,7 @@ Check each area:
1839
1839
  ### 1. Topic-Project Bindings
1840
1840
 
1841
1841
  \\\`\\\`\\\`
1842
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/topic-bindings
1842
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/topic-bindings
1843
1843
  \\\`\\\`\\\`
1844
1844
 
1845
1845
  - Are all bindings still valid?
@@ -1849,7 +1849,7 @@ curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/topic-bindings
1849
1849
  ### 2. Project Map Freshness
1850
1850
 
1851
1851
  \\\`\\\`\\\`
1852
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/project-map
1852
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/project-map
1853
1853
  \\\`\\\`\\\`
1854
1854
 
1855
1855
  - Check the \\\`generatedAt\\\` timestamp.
@@ -1868,7 +1868,7 @@ Flag any that are missing, empty, or contain invalid JSON. Look for stale entrie
1868
1868
  ### 4. Context Segments
1869
1869
 
1870
1870
  \\\`\\\`\\\`
1871
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/context
1871
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/context
1872
1872
  \\\`\\\`\\\`
1873
1873
 
1874
1874
  - Are all expected segments present?
@@ -1931,7 +1931,7 @@ For each feature with **3+ repeated degradations** — this is a PATTERN, not a
1931
1931
  Submit feedback for each pattern:
1932
1932
 
1933
1933
  \\\`\\\`\\\`
1934
- curl -s -X POST http://localhost:${port}/feedback \\
1934
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/feedback \\
1935
1935
  -H "Authorization: Bearer $AUTH" \\
1936
1936
  -H 'Content-Type: application/json' \\
1937
1937
  -d '{"type":"bug","title":"Repeated degradation: FEATURE","description":"FEATURE has degraded N times. Primary: X. Fallback: Y. Most recent reason: Z. This pattern indicates the primary path needs fixing."}'
@@ -1977,7 +1977,7 @@ AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get
1977
1977
  If \\\`.instar/state/active-job.json\\\` exists, verify the session it references is actually running:
1978
1978
 
1979
1979
  \\\`\\\`\\\`
1980
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/sessions
1980
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/sessions
1981
1981
  \\\`\\\`\\\`
1982
1982
 
1983
1983
  Check if the session name matches. If the session is dead but active-job.json persists, it's orphaned — delete it.
@@ -1987,7 +1987,7 @@ Check if the session name matches. If the session is dead but active-job.json pe
1987
1987
  Read \\\`.instar/state/job-topic-mappings.json\\\`. For each mapping, verify the topic ID is reachable:
1988
1988
 
1989
1989
  \\\`\\\`\\\`
1990
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/telegram/topics
1990
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/telegram/topics
1991
1991
  \\\`\\\`\\\`
1992
1992
 
1993
1993
  If topics have been deleted, the mapping is stale — flag it.
@@ -2005,7 +2005,7 @@ Report bloated files and prune where safe.
2005
2005
  Read \\\`.instar/config.json\\\`. If Telegram is configured, verify the bot is connected:
2006
2006
 
2007
2007
  \\\`\\\`\\\`
2008
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/health
2008
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/health
2009
2009
  \\\`\\\`\\\`
2010
2010
 
2011
2011
  Check if the telegram field shows connected. If config says telegram but health says disconnected, report the discrepancy.
@@ -2079,7 +2079,7 @@ Are entries grouped by topic? Is the structure navigable? Reorganize if needed.
2079
2079
  - Log a learning if you discover a pattern:
2080
2080
 
2081
2081
  \\\`\\\`\\\`
2082
- curl -s -X POST http://localhost:${port}/evolution/learnings \\
2082
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/evolution/learnings \\
2083
2083
  -H "Authorization: Bearer $AUTH" \\
2084
2084
  -H 'Content-Type: application/json' \\
2085
2085
  -d '{"category":"memory","insight":"...","confidence":"high"}'
@@ -2123,7 +2123,7 @@ AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get
2123
2123
  ### 1. Job Health
2124
2124
 
2125
2125
  \\\`\\\`\\\`
2126
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/jobs
2126
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/jobs
2127
2127
  \\\`\\\`\\\`
2128
2128
 
2129
2129
  For each enabled job, check:
@@ -2135,7 +2135,7 @@ For each enabled job, check:
2135
2135
  ### 2. Skip Ledger Trends
2136
2136
 
2137
2137
  \\\`\\\`\\\`
2138
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/skip-ledger/workloads
2138
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/skip-ledger/workloads
2139
2139
  \\\`\\\`\\\`
2140
2140
 
2141
2141
  If any job has been skipped more than 10 times by its gate, the gate may be misconfigured (always returning skip), or the feature it monitors is permanently broken.
@@ -2151,7 +2151,7 @@ Read \\\`.instar/state/degradation-events.json\\\` — if events exist but none
2151
2151
  ### 5. Session Monitor
2152
2152
 
2153
2153
  \\\`\\\`\\\`
2154
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/sessions
2154
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/sessions
2155
2155
  \\\`\\\`\\\`
2156
2156
 
2157
2157
  Are there zombie sessions (status: running but started > 30 minutes ago for a job that should take 5)?
@@ -2199,7 +2199,7 @@ AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get
2199
2199
  ### 1. Recent Sessions
2200
2200
 
2201
2201
  \\\`\\\`\\\`
2202
- curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/sessions
2202
+ curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/sessions
2203
2203
  \\\`\\\`\\\`
2204
2204
 
2205
2205
  Get sessions that completed in the last 8 hours.
@@ -2490,7 +2490,7 @@ function getDefaultJobs(port) {
2490
2490
  enabled: true,
2491
2491
  execute: {
2492
2492
  type: 'prompt',
2493
- value: `Run a quick health check: verify the instar server is responding (curl http://localhost:${port}/health), check disk space (df -h), and report any issues. Only send a message if something needs attention — silence means healthy. IMPORTANT: If you find issues, describe them in plain conversational language. Never dump raw JSON, field names, error codes, or structured data. The user reads these on their phone — write like you're texting them a quick heads-up. If the health response includes a degradationSummary array, relay those narrative strings directly.`,
2493
+ value: `Run a quick health check: verify the instar server is responding (curl http://localhost:\${INSTAR_PORT:-${port}}/health), check disk space (df -h), and report any issues. Only send a message if something needs attention — silence means healthy. IMPORTANT: If you find issues, describe them in plain conversational language. Never dump raw JSON, field names, error codes, or structured data. The user reads these on their phone — write like you're texting them a quick heads-up. If the health response includes a degradationSummary array, relay those narrative strings directly.`,
2494
2494
  },
2495
2495
  tags: ['cat:guardian'],
2496
2496
  },
@@ -2529,7 +2529,7 @@ echo ""
2529
2529
  echo "If you find genuine learnings:"
2530
2530
  echo "1. Update .instar/MEMORY.md with the insight (append to the file)"
2531
2531
  echo "2. Be specific: include what was learned, why it matters, and how it should guide future work"
2532
- echo "3. Signal completion: curl -s -X POST http://localhost:${port}/reflection/record -H 'Content-Type: application/json' -d '{\"type\":\"quick\"}'"
2532
+ echo "3. Signal completion: curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/reflection/record -H 'Content-Type: application/json' -d '{\"type\":\"quick\"}'"
2533
2533
  echo ""
2534
2534
  echo "If nothing significant, do nothing. Silence means continuity is working as expected."`,
2535
2535
  },
@@ -2559,10 +2559,10 @@ echo "If nothing significant, do nothing. Silence means continuity is working as
2559
2559
  expectedDurationMinutes: 1,
2560
2560
  model: 'haiku',
2561
2561
  enabled: true,
2562
- gate: `curl -sf http://localhost:${port}/health >/dev/null 2>&1`,
2562
+ gate: `curl -sf http://localhost:\${INSTAR_PORT:-${port}}/health >/dev/null 2>&1`,
2563
2563
  execute: {
2564
2564
  type: 'script',
2565
- value: `RESULT=$(curl -s -X POST http://localhost:${port}/feedback/retry 2>/dev/null); COUNT=$(echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('retried',0))" 2>/dev/null || echo 0); [ "$COUNT" -gt "0" ] && echo "Feedback retry: $COUNT item(s) forwarded." || echo "Feedback retry: nothing pending."`,
2565
+ value: `RESULT=$(curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/feedback/retry 2>/dev/null); COUNT=$(echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('retried',0))" 2>/dev/null || echo 0); [ "$COUNT" -gt "0" ] && echo "Feedback retry: $COUNT item(s) forwarded." || echo "Feedback retry: nothing pending."`,
2566
2566
  },
2567
2567
  tags: ['cat:infrastructure'],
2568
2568
  },
@@ -2575,10 +2575,10 @@ echo "If nothing significant, do nothing. Silence means continuity is working as
2575
2575
  expectedDurationMinutes: 3,
2576
2576
  model: 'opus',
2577
2577
  enabled: true,
2578
- gate: `curl -sf -H "Authorization: Bearer $INSTAR_AUTH_TOKEN" http://localhost:${port}/evolution/learnings?applied=false 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d.get('learnings',[])) > 0 else 1)"`,
2578
+ gate: `curl -sf -H "Authorization: Bearer $INSTAR_AUTH_TOKEN" http://localhost:\${INSTAR_PORT:-${port}}/evolution/learnings?applied=false 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d.get('learnings',[])) > 0 else 1)"`,
2579
2579
  execute: {
2580
2580
  type: 'prompt',
2581
- value: `Harvest and synthesize learnings: curl -s http://localhost:${port}/evolution/learnings?applied=false
2581
+ value: `Harvest and synthesize learnings: curl -s http://localhost:\${INSTAR_PORT:-${port}}/evolution/learnings?applied=false
2582
2582
 
2583
2583
  Review unapplied learnings and look for:
2584
2584
  1. **Patterns**: Multiple learnings pointing to the same conclusion
@@ -2586,10 +2586,10 @@ Review unapplied learnings and look for:
2586
2586
  3. **Cross-domain connections**: Insights from one area that apply to another
2587
2587
 
2588
2588
  For each actionable pattern found, create an evolution proposal:
2589
- curl -s -X POST http://localhost:${port}/evolution/proposals -H 'Content-Type: application/json' -d '{"title":"...","source":"insight-harvest from LRN-XXX","description":"...","type":"...","impact":"...","effort":"..."}'
2589
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals -H 'Content-Type: application/json' -d '{"title":"...","source":"insight-harvest from LRN-XXX","description":"...","type":"...","impact":"...","effort":"..."}'
2590
2590
 
2591
2591
  Then mark the relevant learnings as applied:
2592
- curl -s -X PATCH http://localhost:${port}/evolution/learnings/LRN-XXX/apply -H 'Content-Type: application/json' -d '{"appliedTo":"EVO-XXX"}'
2592
+ curl -s -X PATCH http://localhost:\${INSTAR_PORT:-${port}}/evolution/learnings/LRN-XXX/apply -H 'Content-Type: application/json' -d '{"appliedTo":"EVO-XXX"}'
2593
2593
 
2594
2594
  Also update MEMORY.md with any patterns worth preserving long-term.
2595
2595
 
@@ -2606,18 +2606,18 @@ If no actionable patterns found, exit silently.`,
2606
2606
  expectedDurationMinutes: 2,
2607
2607
  model: 'haiku',
2608
2608
  enabled: true,
2609
- gate: `curl -sf -H "Authorization: Bearer $INSTAR_AUTH_TOKEN" http://localhost:${port}/evolution/actions/overdue 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d.get('overdue',[])) > 0 else 1)"`,
2609
+ gate: `curl -sf -H "Authorization: Bearer $INSTAR_AUTH_TOKEN" http://localhost:\${INSTAR_PORT:-${port}}/evolution/actions/overdue 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d.get('overdue',[])) > 0 else 1)"`,
2610
2610
  execute: {
2611
2611
  type: 'prompt',
2612
- value: `Check for overdue commitments: curl -s http://localhost:${port}/evolution/actions/overdue
2612
+ value: `Check for overdue commitments: curl -s http://localhost:\${INSTAR_PORT:-${port}}/evolution/actions/overdue
2613
2613
 
2614
2614
  For each overdue action:
2615
2615
  1. Assess: Can this be completed now? Is it still relevant?
2616
2616
  2. If actionable, attempt to complete it or advance it
2617
- 3. If no longer relevant, cancel it: curl -s -X PATCH http://localhost:${port}/evolution/actions/ACT-XXX -H 'Content-Type: application/json' -d '{"status":"cancelled","resolution":"No longer relevant because..."}'
2617
+ 3. If no longer relevant, cancel it: curl -s -X PATCH http://localhost:\${INSTAR_PORT:-${port}}/evolution/actions/ACT-XXX -H 'Content-Type: application/json' -d '{"status":"cancelled","resolution":"No longer relevant because..."}'
2618
2618
  4. If blocked, escalate to the user via Telegram (if configured)
2619
2619
 
2620
- Also check pending actions (curl -s http://localhost:${port}/evolution/actions?status=pending) for items that have been pending more than 48 hours without a due date — these are forgotten commitments.
2620
+ Also check pending actions (curl -s http://localhost:\${INSTAR_PORT:-${port}}/evolution/actions?status=pending) for items that have been pending more than 48 hours without a due date — these are forgotten commitments.
2621
2621
 
2622
2622
  If no overdue or stale items, exit silently.`,
2623
2623
  },
@@ -2632,10 +2632,10 @@ If no overdue or stale items, exit silently.`,
2632
2632
  expectedDurationMinutes: 1,
2633
2633
  model: 'haiku',
2634
2634
  enabled: true,
2635
- gate: `curl -sf http://localhost:${port}/health >/dev/null 2>&1`,
2635
+ gate: `curl -sf http://localhost:\${INSTAR_PORT:-${port}}/health >/dev/null 2>&1`,
2636
2636
  execute: {
2637
2637
  type: 'script',
2638
- value: `RESULT=$(curl -s -X POST http://localhost:${port}/project-map/refresh -H "Authorization: Bearer $(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken',''))" 2>/dev/null)" 2>/dev/null); echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'Project map refreshed: {d.get(\"totalFiles\",0)} files, {d.get(\"directories\",0)} dirs')" 2>/dev/null || echo "Project map refresh: done"`,
2638
+ value: `RESULT=$(curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/project-map/refresh -H "Authorization: Bearer $(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken',''))" 2>/dev/null)" 2>/dev/null); echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(f'Project map refreshed: {d.get(\"totalFiles\",0)} files, {d.get(\"directories\",0)} dirs')" 2>/dev/null || echo "Project map refresh: done"`,
2639
2639
  },
2640
2640
  tags: ['cat:maintenance', 'role:worker', 'exec:script'],
2641
2641
  },
@@ -2648,7 +2648,7 @@ If no overdue or stale items, exit silently.`,
2648
2648
  expectedDurationMinutes: 2,
2649
2649
  model: 'haiku',
2650
2650
  enabled: true,
2651
- gate: `curl -sf http://localhost:${port}/health >/dev/null 2>&1`,
2651
+ gate: `curl -sf http://localhost:\${INSTAR_PORT:-${port}}/health >/dev/null 2>&1`,
2652
2652
  execute: {
2653
2653
  type: 'skill',
2654
2654
  value: 'coherence-audit',
@@ -2680,7 +2680,7 @@ If no overdue or stale items, exit silently.`,
2680
2680
  expectedDurationMinutes: 1,
2681
2681
  model: 'haiku',
2682
2682
  enabled: true,
2683
- gate: `curl -sf http://localhost:${port}/health >/dev/null 2>&1`,
2683
+ gate: `curl -sf http://localhost:\${INSTAR_PORT:-${port}}/health >/dev/null 2>&1`,
2684
2684
  execute: {
2685
2685
  type: 'skill',
2686
2686
  value: 'state-integrity-check',
@@ -2716,7 +2716,7 @@ If no overdue or stale items, exit silently.`,
2716
2716
  expectedDurationMinutes: 2,
2717
2717
  model: 'haiku',
2718
2718
  enabled: true,
2719
- gate: `curl -sf http://localhost:${port}/health >/dev/null 2>&1`,
2719
+ gate: `curl -sf http://localhost:\${INSTAR_PORT:-${port}}/health >/dev/null 2>&1`,
2720
2720
  execute: {
2721
2721
  type: 'skill',
2722
2722
  value: 'guardian-pulse',
@@ -2732,7 +2732,7 @@ If no overdue or stale items, exit silently.`,
2732
2732
  expectedDurationMinutes: 2,
2733
2733
  model: 'haiku',
2734
2734
  enabled: true,
2735
- gate: `curl -sf http://localhost:${port}/health >/dev/null 2>&1`,
2735
+ gate: `curl -sf http://localhost:\${INSTAR_PORT:-${port}}/health >/dev/null 2>&1`,
2736
2736
  execute: {
2737
2737
  type: 'skill',
2738
2738
  value: 'session-continuity-check',
@@ -2748,10 +2748,10 @@ If no overdue or stale items, exit silently.`,
2748
2748
  expectedDurationMinutes: 1,
2749
2749
  model: 'haiku',
2750
2750
  enabled: true,
2751
- gate: `curl -sf http://localhost:${port}/health >/dev/null 2>&1 && AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken',''))" 2>/dev/null) && curl -sf -H "Authorization: Bearer $AUTH" http://localhost:${port}/semantic/stats >/dev/null 2>&1`,
2751
+ gate: `curl -sf http://localhost:\${INSTAR_PORT:-${port}}/health >/dev/null 2>&1 && AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken',''))" 2>/dev/null) && curl -sf -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/semantic/stats >/dev/null 2>&1`,
2752
2752
  execute: {
2753
2753
  type: 'script',
2754
- value: `AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken',''))" 2>/dev/null); AGENT=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('agentName','Agent'))" 2>/dev/null); RESULT=$(curl -s -X POST -H "Authorization: Bearer $AUTH" -H "Content-Type: application/json" -d "{\\"filePath\\":\\".instar/MEMORY.md\\",\\"agentName\\":\\"$AGENT\\"}" http://localhost:${port}/semantic/export-memory 2>/dev/null); COUNT=$(echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('entityCount',0))" 2>/dev/null || echo 0); EXCLUDED=$(echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('excludedCount',0))" 2>/dev/null || echo 0); [ "$COUNT" -gt "0" ] && echo "Memory export: $COUNT entities written to MEMORY.md ($EXCLUDED excluded below threshold)." || echo "Memory export: no entities to export."`,
2754
+ value: `AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken',''))" 2>/dev/null); AGENT=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('agentName','Agent'))" 2>/dev/null); RESULT=$(curl -s -X POST -H "Authorization: Bearer $AUTH" -H "Content-Type: application/json" -d "{\\"filePath\\":\\".instar/MEMORY.md\\",\\"agentName\\":\\"$AGENT\\"}" http://localhost:\${INSTAR_PORT:-${port}}/semantic/export-memory 2>/dev/null); COUNT=$(echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('entityCount',0))" 2>/dev/null || echo 0); EXCLUDED=$(echo "$RESULT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('excludedCount',0))" 2>/dev/null || echo 0); [ "$COUNT" -gt "0" ] && echo "Memory export: $COUNT entities written to MEMORY.md ($EXCLUDED excluded below threshold)." || echo "Memory export: no entities to export."`,
2755
2755
  },
2756
2756
  tags: ['cat:maintenance', 'role:worker', 'exec:script'],
2757
2757
  },
@@ -2781,10 +2781,10 @@ If no overdue or stale items, exit silently.`,
2781
2781
  expectedDurationMinutes: 1,
2782
2782
  model: 'haiku',
2783
2783
  enabled: true,
2784
- gate: `curl -sf http://localhost:${port}/health >/dev/null 2>&1`,
2784
+ gate: `curl -sf http://localhost:\${INSTAR_PORT:-${port}}/health >/dev/null 2>&1`,
2785
2785
  execute: {
2786
2786
  type: 'script',
2787
- value: `AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken',''))" 2>/dev/null); REFRESH=$(curl -s -X POST -H "Authorization: Bearer $AUTH" http://localhost:${port}/capability-map/refresh 2>/dev/null); DRIFT=$(curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/capability-map/drift 2>/dev/null); ADDED=$(echo "$DRIFT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d.get('added',[])))" 2>/dev/null || echo 0); REMOVED=$(echo "$DRIFT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d.get('removed',[])))" 2>/dev/null || echo 0); CHANGED=$(echo "$DRIFT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d.get('changed',[])))" 2>/dev/null || echo 0); UNMAPPED=$(echo "$DRIFT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d.get('unmapped',[])))" 2>/dev/null || echo 0); if [ "$ADDED" -gt "0" ] || [ "$REMOVED" -gt "0" ] || [ "$CHANGED" -gt "0" ] || [ "$UNMAPPED" -gt "0" ]; then echo "Capability drift detected: +$ADDED -$REMOVED ~$CHANGED ?$UNMAPPED"; echo "$DRIFT" | python3 -c "import sys,json; d=json.load(sys.stdin); [print(f' + {c[\"id\"]}') for c in d.get('added',[])]; [print(f' - {r[\"id\"]}') for r in d.get('removed',[])]; [print(f' ~ {c[\"id\"]} ({c[\"field\"]})') for c in d.get('changed',[])]" 2>/dev/null; else echo "Capability audit: no drift detected."; fi`,
2787
+ value: `AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken',''))" 2>/dev/null); REFRESH=$(curl -s -X POST -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/capability-map/refresh 2>/dev/null); DRIFT=$(curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/capability-map/drift 2>/dev/null); ADDED=$(echo "$DRIFT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d.get('added',[])))" 2>/dev/null || echo 0); REMOVED=$(echo "$DRIFT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d.get('removed',[])))" 2>/dev/null || echo 0); CHANGED=$(echo "$DRIFT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d.get('changed',[])))" 2>/dev/null || echo 0); UNMAPPED=$(echo "$DRIFT" | python3 -c "import sys,json; d=json.load(sys.stdin); print(len(d.get('unmapped',[])))" 2>/dev/null || echo 0); if [ "$ADDED" -gt "0" ] || [ "$REMOVED" -gt "0" ] || [ "$CHANGED" -gt "0" ] || [ "$UNMAPPED" -gt "0" ]; then echo "Capability drift detected: +$ADDED -$REMOVED ~$CHANGED ?$UNMAPPED"; echo "$DRIFT" | python3 -c "import sys,json; d=json.load(sys.stdin); [print(f' + {c[\"id\"]}') for c in d.get('added',[])]; [print(f' - {r[\"id\"]}') for r in d.get('removed',[])]; [print(f' ~ {c[\"id\"]} ({c[\"field\"]})') for c in d.get('changed',[])]" 2>/dev/null; else echo "Capability audit: no drift detected."; fi`,
2788
2788
  },
2789
2789
  grounding: {
2790
2790
  requiresIdentity: false,
@@ -2801,22 +2801,22 @@ If no overdue or stale items, exit silently.`,
2801
2801
  expectedDurationMinutes: 5,
2802
2802
  model: 'opus',
2803
2803
  enabled: true,
2804
- gate: `curl -sf http://localhost:${port}/health >/dev/null 2>&1 && test -f .instar/soul.md`,
2804
+ gate: `curl -sf http://localhost:\${INSTAR_PORT:-${port}}/health >/dev/null 2>&1 && test -f .instar/soul.md`,
2805
2805
  execute: {
2806
2806
  type: 'prompt',
2807
2807
  value: `Identity review — check your identity coherence and growth.
2808
2808
 
2809
2809
  AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken',''))" 2>/dev/null)
2810
2810
 
2811
- 1. **Check soul.md drift**: curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/identity/soul/drift
2811
+ 1. **Check soul.md drift**: curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/identity/soul/drift
2812
2812
  - If anyAboveThreshold is true, review the divergence. Is this healthy growth or unexpected drift?
2813
2813
  - If drift looks healthy, mark it reviewed: the growth is intentional.
2814
2814
  - If drift looks concerning, flag with [ATTENTION] so the user is notified.
2815
2815
 
2816
- 2. **Check pending changes**: curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/identity/soul/pending
2816
+ 2. **Check pending changes**: curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/identity/soul/pending
2817
2817
  - If pending changes exist, surface them to the user via Telegram (the user should approve/reject these).
2818
2818
 
2819
- 3. **Check for identity-relevant learnings**: curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/evolution/learnings?applied=false
2819
+ 3. **Check for identity-relevant learnings**: curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/evolution/learnings?applied=false
2820
2820
  - For each unapplied learning, assess: is this about operational knowledge (how to do something) or about your values, beliefs, or self-understanding?
2821
2821
  - If you find 3+ identity-relevant learnings since your last soul.md update, consider running /reflect.
2822
2822
  - Don't force it — if none of the learnings touch on identity, that's fine. Exit silently.
@@ -2826,7 +2826,7 @@ AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get
2826
2826
  - Is the Self-Observations section populated? If you've noticed behavioral patterns, document them.
2827
2827
  - Update Identity History if you make changes.
2828
2828
 
2829
- 5. **Integrity check**: curl -s -H "Authorization: Bearer $AUTH" http://localhost:${port}/identity/soul/integrity
2829
+ 5. **Integrity check**: curl -s -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/identity/soul/integrity
2830
2830
  - If integrity fails, flag with [ATTENTION] — soul.md may have been modified outside normal channels.
2831
2831
 
2832
2832
  If everything is coherent and no reflection is needed, exit silently. Only report via [ATTENTION] if drift is concerning, integrity fails, or pending changes need user action.`,
@@ -2847,10 +2847,10 @@ If everything is coherent and no reflection is needed, exit silently. Only repor
2847
2847
  expectedDurationMinutes: 3,
2848
2848
  model: 'sonnet',
2849
2849
  enabled: true,
2850
- gate: `curl -sf -H "Authorization: Bearer $INSTAR_AUTH_TOKEN" http://localhost:${port}/evolution/proposals?status=proposed 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d.get('proposals',[])) > 0 else 1)"`,
2850
+ gate: `curl -sf -H "Authorization: Bearer $INSTAR_AUTH_TOKEN" http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals?status=proposed 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d.get('proposals',[])) > 0 else 1)"`,
2851
2851
  execute: {
2852
2852
  type: 'prompt',
2853
- value: `Review pending evolution proposals: curl -s http://localhost:${port}/evolution/proposals?status=proposed\n\nFor each proposal:\n1. Read the title, description, type, and source\n2. Evaluate: Is this a genuine improvement? Is the effort worth the impact? Does it align with our goals?\n3. If approved, update status: curl -s -X PATCH http://localhost:${port}/evolution/proposals/EVO-XXX -H 'Content-Type: application/json' -d '{"status":"approved"}'\n4. If rejected or deferred, update with reason.\n\nDo NOT implement approved proposals — that's handled by the paired evolution-proposal-implement job.\n\nAlso check the dashboard: curl -s http://localhost:${port}/evolution — report any highlights to the user if they seem important.\n\nIf no proposals need attention, exit silently.`,
2853
+ value: `Review pending evolution proposals: curl -s http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals?status=proposed\n\nFor each proposal:\n1. Read the title, description, type, and source\n2. Evaluate: Is this a genuine improvement? Is the effort worth the impact? Does it align with our goals?\n3. If approved, update status: curl -s -X PATCH http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals/EVO-XXX -H 'Content-Type: application/json' -d '{"status":"approved"}'\n4. If rejected or deferred, update with reason.\n\nDo NOT implement approved proposals — that's handled by the paired evolution-proposal-implement job.\n\nAlso check the dashboard: curl -s http://localhost:\${INSTAR_PORT:-${port}}/evolution — report any highlights to the user if they seem important.\n\nIf no proposals need attention, exit silently.`,
2854
2854
  },
2855
2855
  tags: ['cat:learning', 'role:worker', 'exec:prompt', 'pair:evolution-proposal-implement'],
2856
2856
  },
@@ -2863,10 +2863,10 @@ If everything is coherent and no reflection is needed, exit silently. Only repor
2863
2863
  expectedDurationMinutes: 10,
2864
2864
  model: 'opus',
2865
2865
  enabled: true,
2866
- gate: `curl -sf -H "Authorization: Bearer $INSTAR_AUTH_TOKEN" http://localhost:${port}/evolution/proposals?status=approved 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d.get('proposals',[])) > 0 else 1)"`,
2866
+ gate: `curl -sf -H "Authorization: Bearer $INSTAR_AUTH_TOKEN" http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals?status=approved 2>/dev/null | python3 -c "import sys,json; d=json.load(sys.stdin); exit(0 if len(d.get('proposals',[])) > 0 else 1)"`,
2867
2867
  execute: {
2868
2868
  type: 'prompt',
2869
- value: `Implement approved evolution proposals: curl -s http://localhost:${port}/evolution/proposals?status=approved\n\nFor each approved proposal:\n1. Read the full description and understand what needs to be built\n2. Implement it: create the skill/hook/job/config change described\n3. After implementation, mark complete: curl -s -X PATCH http://localhost:${port}/evolution/proposals/EVO-XXX -H 'Content-Type: application/json' -d '{"status":"implemented","resolution":"What was done"}'\n\nIf no approved proposals exist, exit silently.`,
2869
+ value: `Implement approved evolution proposals: curl -s http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals?status=approved\n\nFor each approved proposal:\n1. Read the full description and understand what needs to be built\n2. Implement it: create the skill/hook/job/config change described\n3. After implementation, mark complete: curl -s -X PATCH http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals/EVO-XXX -H 'Content-Type: application/json' -d '{"status":"implemented","resolution":"What was done"}'\n\nIf no approved proposals exist, exit silently.`,
2870
2870
  },
2871
2871
  grounding: {
2872
2872
  requiresIdentity: true,
@@ -2883,10 +2883,10 @@ If everything is coherent and no reflection is needed, exit silently. Only repor
2883
2883
  expectedDurationMinutes: 1,
2884
2884
  model: 'haiku',
2885
2885
  enabled: true,
2886
- gate: `curl -sf http://localhost:${port}/health >/dev/null 2>&1`,
2886
+ gate: `curl -sf http://localhost:\${INSTAR_PORT:-${port}}/health >/dev/null 2>&1`,
2887
2887
  execute: {
2888
2888
  type: 'prompt',
2889
- value: `Scan recent messages for commitments and promises.\n\nAUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken',''))" 2>/dev/null)\n\n1. Read your bookmark: cat .instar/state/commitment-detection-bookmark.json 2>/dev/null || echo '{"lastProcessedId": 0}'\n2. Fetch new messages since bookmark from Telegram message log: tail -100 .instar/telegram-messages.jsonl\n3. For each new message, check: does it contain a commitment, promise, or action item? Look for patterns like 'I will', 'let me', 'I\\'ll build', 'we should', 'TODO', 'action item', deadlines, etc.\n4. For each detected commitment, register it: curl -s -X POST http://localhost:${port}/evolution/actions -H "Authorization: Bearer $AUTH" -H 'Content-Type: application/json' -d '{"title":"...","source":"commitment-detection","description":"...","dueDate":"..."}'\n5. Update bookmark with the last processed message ID.\n\nOnly process NEW messages since last bookmark. Exit silently if no new commitments found.`,
2889
+ value: `Scan recent messages for commitments and promises.\n\nAUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken',''))" 2>/dev/null)\n\n1. Read your bookmark: cat .instar/state/commitment-detection-bookmark.json 2>/dev/null || echo '{"lastProcessedId": 0}'\n2. Fetch new messages since bookmark from Telegram message log: tail -100 .instar/telegram-messages.jsonl\n3. For each new message, check: does it contain a commitment, promise, or action item? Look for patterns like 'I will', 'let me', 'I\\'ll build', 'we should', 'TODO', 'action item', deadlines, etc.\n4. For each detected commitment, register it: curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/evolution/actions -H "Authorization: Bearer $AUTH" -H 'Content-Type: application/json' -d '{"title":"...","source":"commitment-detection","description":"...","dueDate":"..."}'\n5. Update bookmark with the last processed message ID.\n\nOnly process NEW messages since last bookmark. Exit silently if no new commitments found.`,
2890
2890
  },
2891
2891
  tags: ['cat:evolution', 'role:worker', 'exec:prompt', 'pair:evolution-overdue-check'],
2892
2892
  },
@@ -2899,10 +2899,10 @@ If everything is coherent and no reflection is needed, exit silently. Only repor
2899
2899
  expectedDurationMinutes: 1,
2900
2900
  model: 'haiku',
2901
2901
  enabled: true,
2902
- gate: `curl -sf http://localhost:${port}/health >/dev/null 2>&1`,
2902
+ gate: `curl -sf http://localhost:\${INSTAR_PORT:-${port}}/health >/dev/null 2>&1`,
2903
2903
  execute: {
2904
2904
  type: 'script',
2905
- value: `AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken','')).strip()" 2>/dev/null) && curl -sf -X POST -H "Authorization: Bearer $AUTH" http://localhost:${port}/telegram/dashboard-refresh`,
2905
+ value: `AUTH=$(python3 -c "import json; print(json.load(open('.instar/config.json')).get('authToken','')).strip()" 2>/dev/null) && curl -sf -X POST -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/telegram/dashboard-refresh`,
2906
2906
  },
2907
2907
  tags: ['cat:infrastructure', 'role:worker', 'exec:script'],
2908
2908
  telegramNotify: false,
@@ -2918,7 +2918,7 @@ If everything is coherent and no reflection is needed, exit silently. Only repor
2918
2918
  enabled: true,
2919
2919
  execute: {
2920
2920
  type: 'prompt',
2921
- value: `You are a Category Overseer for the GUARDIAN category. Your job is to review all guardian/monitoring jobs and assess the health of the monitoring system itself.\n\n1. Fetch the category report: curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/jobs/category-report/guardian?sinceHours=24\n2. Analyze the report for:\n - Jobs with high failure rates or consecutive failures\n - Jobs that are being skipped excessively (especially for quota reasons)\n - Schedule mismatches (jobs running too often or not often enough for their purpose)\n - Model over-allocation (could any job use a cheaper model?)\n - Contradictions between job findings (e.g., health-check says healthy but degradation-digest found issues)\n - Coverage gaps (are there monitoring blind spots?)\n3. Read the handoff notes from each job — do they tell a coherent story?\n4. If you find actionable issues, write a clear summary. If everything is healthy, say so briefly.\n\nWrite your findings in [HANDOFF] tags for the next overseer run. Focus on trends and cross-job insights that individual jobs can't see.`,
2921
+ value: `You are a Category Overseer for the GUARDIAN category. Your job is to review all guardian/monitoring jobs and assess the health of the monitoring system itself.\n\n1. Fetch the category report: curl -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/jobs/category-report/guardian?sinceHours=24\n2. Analyze the report for:\n - Jobs with high failure rates or consecutive failures\n - Jobs that are being skipped excessively (especially for quota reasons)\n - Schedule mismatches (jobs running too often or not often enough for their purpose)\n - Model over-allocation (could any job use a cheaper model?)\n - Contradictions between job findings (e.g., health-check says healthy but degradation-digest found issues)\n - Coverage gaps (are there monitoring blind spots?)\n3. Read the handoff notes from each job — do they tell a coherent story?\n4. If you find actionable issues, write a clear summary. If everything is healthy, say so briefly.\n\nWrite your findings in [HANDOFF] tags for the next overseer run. Focus on trends and cross-job insights that individual jobs can't see.`,
2922
2922
  },
2923
2923
  tags: ['cat:overseer', 'role:supervisor'],
2924
2924
  telegramNotify: 'on-alert',
@@ -2934,7 +2934,7 @@ If everything is coherent and no reflection is needed, exit silently. Only repor
2934
2934
  enabled: true,
2935
2935
  execute: {
2936
2936
  type: 'prompt',
2937
- value: `You are a Category Overseer for the LEARNING category. Your job is to review all evolution/learning jobs and assess whether the learning pipeline is producing genuine value.\n\n1. Fetch the category report: curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/jobs/category-report/learning?sinceHours=48\n2. Analyze:\n - Are evolution proposals being generated AND accepted? What's the accept/reject ratio?\n - Is insight-harvest finding novel insights or recycling stale ones?\n - Are commitments being tracked and completed, or piling up?\n - Is reflection-trigger producing meaningful MEMORY.md updates?\n - Are any learning jobs consistently skipped due to quota? This means the learning pipeline is being starved.\n - Model costs: reflection-trigger uses opus — is the quality difference worth it vs sonnet?\n3. Look for the meta-pattern: is the agent actually getting smarter over time, or is the learning pipeline just busy-work?\n4. Check handoff notes for patterns across runs.\n\nWrite findings in [HANDOFF] tags. Flag if the learning pipeline is producing diminishing returns.`,
2937
+ value: `You are a Category Overseer for the LEARNING category. Your job is to review all evolution/learning jobs and assess whether the learning pipeline is producing genuine value.\n\n1. Fetch the category report: curl -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/jobs/category-report/learning?sinceHours=48\n2. Analyze:\n - Are evolution proposals being generated AND accepted? What's the accept/reject ratio?\n - Is insight-harvest finding novel insights or recycling stale ones?\n - Are commitments being tracked and completed, or piling up?\n - Is reflection-trigger producing meaningful MEMORY.md updates?\n - Are any learning jobs consistently skipped due to quota? This means the learning pipeline is being starved.\n - Model costs: reflection-trigger uses opus — is the quality difference worth it vs sonnet?\n3. Look for the meta-pattern: is the agent actually getting smarter over time, or is the learning pipeline just busy-work?\n4. Check handoff notes for patterns across runs.\n\nWrite findings in [HANDOFF] tags. Flag if the learning pipeline is producing diminishing returns.`,
2938
2938
  },
2939
2939
  tags: ['cat:overseer', 'role:supervisor'],
2940
2940
  telegramNotify: 'on-alert',
@@ -2950,7 +2950,7 @@ If everything is coherent and no reflection is needed, exit silently. Only repor
2950
2950
  enabled: true,
2951
2951
  execute: {
2952
2952
  type: 'prompt',
2953
- value: `You are a Category Overseer for the MAINTENANCE category. Your job is to review all housekeeping/maintenance jobs and ensure they're keeping the system clean.\n\n1. Fetch the category report: curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/jobs/category-report/maintenance?sinceHours=48\n2. Analyze:\n - Is memory-hygiene actually reducing stale entries, or finding nothing each run?\n - Is project-map-refresh keeping the map accurate? How often does it find drift?\n - Is coherence-audit finding real misalignments or just confirming everything is fine?\n - Are any maintenance jobs redundant with each other? (e.g., overlapping checks)\n - Are skill-type jobs (coherence-audit, memory-hygiene) running correctly?\n - Workload trends: are jobs processing fewer items over time (diminishing returns)?\n3. Maintenance jobs should trend toward finding LESS work over time. If they consistently find issues, something upstream is broken.\n\nWrite findings in [HANDOFF] tags. Recommend disabling or reducing frequency of jobs that consistently find nothing.`,
2953
+ value: `You are a Category Overseer for the MAINTENANCE category. Your job is to review all housekeeping/maintenance jobs and ensure they're keeping the system clean.\n\n1. Fetch the category report: curl -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/jobs/category-report/maintenance?sinceHours=48\n2. Analyze:\n - Is memory-hygiene actually reducing stale entries, or finding nothing each run?\n - Is project-map-refresh keeping the map accurate? How often does it find drift?\n - Is coherence-audit finding real misalignments or just confirming everything is fine?\n - Are any maintenance jobs redundant with each other? (e.g., overlapping checks)\n - Are skill-type jobs (coherence-audit, memory-hygiene) running correctly?\n - Workload trends: are jobs processing fewer items over time (diminishing returns)?\n3. Maintenance jobs should trend toward finding LESS work over time. If they consistently find issues, something upstream is broken.\n\nWrite findings in [HANDOFF] tags. Recommend disabling or reducing frequency of jobs that consistently find nothing.`,
2954
2954
  },
2955
2955
  tags: ['cat:overseer', 'role:supervisor'],
2956
2956
  telegramNotify: 'on-alert',
@@ -2966,7 +2966,7 @@ If everything is coherent and no reflection is needed, exit silently. Only repor
2966
2966
  enabled: true,
2967
2967
  execute: {
2968
2968
  type: 'prompt',
2969
- value: `You are a Category Overseer for the INFRASTRUCTURE category. Your job is to review infrastructure/plumbing jobs.\n\n1. Fetch the category report: curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/jobs/category-report/infrastructure?sinceHours=48\n2. Analyze:\n - Is git-sync succeeding? Any merge conflicts or divergence?\n - Is dashboard-link-refresh keeping links current? Could it run less often?\n - Is feedback-retry actually retrying anything, or is the queue always empty?\n - Model allocation: git-sync uses high priority — is that justified by its failure rate?\n - Are any infrastructure jobs causing issues for other jobs (e.g., git-sync holding sessions)?\n3. Infrastructure jobs should be boring and reliable. Any excitement is a problem.\n\nWrite findings in [HANDOFF] tags. Keep it brief — infrastructure overseers should be the quietest.`,
2969
+ value: `You are a Category Overseer for the INFRASTRUCTURE category. Your job is to review infrastructure/plumbing jobs.\n\n1. Fetch the category report: curl -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/jobs/category-report/infrastructure?sinceHours=48\n2. Analyze:\n - Is git-sync succeeding? Any merge conflicts or divergence?\n - Is dashboard-link-refresh keeping links current? Could it run less often?\n - Is feedback-retry actually retrying anything, or is the queue always empty?\n - Model allocation: git-sync uses high priority — is that justified by its failure rate?\n - Are any infrastructure jobs causing issues for other jobs (e.g., git-sync holding sessions)?\n3. Infrastructure jobs should be boring and reliable. Any excitement is a problem.\n\nWrite findings in [HANDOFF] tags. Keep it brief — infrastructure overseers should be the quietest.`,
2970
2970
  },
2971
2971
  tags: ['cat:overseer', 'role:supervisor'],
2972
2972
  telegramNotify: 'on-alert',
@@ -2982,7 +2982,7 @@ If everything is coherent and no reflection is needed, exit silently. Only repor
2982
2982
  enabled: true,
2983
2983
  execute: {
2984
2984
  type: 'prompt',
2985
- value: `You are a Category Overseer for the DEVELOPMENT category. Your job is to review development-focused jobs.\n\n1. Fetch the category report: curl -H "Authorization: Bearer $AUTH" http://localhost:${port}/jobs/category-report/development?sinceHours=48\n2. Analyze:\n - Are development jobs consuming appropriate resources for their value?\n - Are there CI/testing patterns that could be automated?\n3. Development jobs are only valuable when there's active development. If the codebase is stable, these could be reduced.\n\nWrite findings in [HANDOFF] tags.`,
2985
+ value: `You are a Category Overseer for the DEVELOPMENT category. Your job is to review development-focused jobs.\n\n1. Fetch the category report: curl -H "Authorization: Bearer $AUTH" http://localhost:\${INSTAR_PORT:-${port}}/jobs/category-report/development?sinceHours=48\n2. Analyze:\n - Are development jobs consuming appropriate resources for their value?\n - Are there CI/testing patterns that could be automated?\n3. Development jobs are only valuable when there's active development. If the codebase is stable, these could be reduced.\n\nWrite findings in [HANDOFF] tags.`,
2986
2986
  },
2987
2987
  tags: ['cat:overseer', 'role:supervisor'],
2988
2988
  telegramNotify: 'on-alert',
@@ -3223,7 +3223,7 @@ function refreshClaudeMd(projectDir, stateDir) {
3223
3223
  **This is critical.** You are running on infrastructure (instar) that is actively evolving. When something breaks, feels wrong, or could be better — **you are the first line of detection.** Do not silently absorb errors. Do not work around bugs without reporting them. Every issue you surface helps every agent on the platform.
3224
3224
 
3225
3225
  **What to watch for:**
3226
- - Server errors: API calls to localhost:${port} failing, unexpected responses, timeouts
3226
+ - Server errors: API calls to localhost:\${INSTAR_PORT:-${port}} failing, unexpected responses, timeouts
3227
3227
  - Hook failures: hooks throwing errors, not firing when expected, blocking when they shouldn't
3228
3228
  - Job issues: jobs not running on schedule, failing silently, taking too long
3229
3229
  - Session problems: sessions not spawning, not being tracked, zombie sessions
@@ -3234,7 +3234,7 @@ function refreshClaudeMd(projectDir, stateDir) {
3234
3234
 
3235
3235
  **When you detect an issue, report it immediately:**
3236
3236
  \`\`\`bash
3237
- curl -s -X POST http://localhost:${port}/feedback \\
3237
+ curl -s -X POST http://localhost:\${INSTAR_PORT:-${port}}/feedback \\
3238
3238
  -H 'Content-Type: application/json' \\
3239
3239
  -d '{"type":"bug","title":"CONCISE_TITLE","description":"FULL_CONTEXT_WITH_ERROR_MESSAGES"}'
3240
3240
  \`\`\`
@@ -3252,22 +3252,22 @@ Types: \`bug\`, \`feature\`, \`improvement\`, \`question\`, \`hallucination\`
3252
3252
  You have a built-in evolution system with four subsystems that track your growth.
3253
3253
 
3254
3254
  **Evolution Queue** — Staged self-improvement proposals.
3255
- - View: \`curl http://localhost:${port}/evolution/proposals\`
3255
+ - View: \`curl http://localhost:\${INSTAR_PORT:-${port}}/evolution/proposals\`
3256
3256
  - Propose: \`/evolve\` skill or \`POST /evolution/proposals\`
3257
3257
 
3258
3258
  **Learning Registry** — Structured, searchable insights.
3259
- - View: \`curl http://localhost:${port}/evolution/learnings\`
3259
+ - View: \`curl http://localhost:\${INSTAR_PORT:-${port}}/evolution/learnings\`
3260
3260
  - Record: \`/learn\` skill or \`POST /evolution/learnings\`
3261
3261
 
3262
3262
  **Capability Gaps** — Track what you're missing.
3263
- - View: \`curl http://localhost:${port}/evolution/gaps\`
3263
+ - View: \`curl http://localhost:\${INSTAR_PORT:-${port}}/evolution/gaps\`
3264
3264
  - Report: \`/gaps\` skill or \`POST /evolution/gaps\`
3265
3265
 
3266
3266
  **Action Queue** — Commitments with follow-through tracking.
3267
- - View: \`curl http://localhost:${port}/evolution/actions\`
3267
+ - View: \`curl http://localhost:\${INSTAR_PORT:-${port}}/evolution/actions\`
3268
3268
  - Create: \`/commit-action\` skill or \`POST /evolution/actions\`
3269
3269
 
3270
- **Dashboard**: \`curl http://localhost:${port}/evolution\`
3270
+ **Dashboard**: \`curl http://localhost:\${INSTAR_PORT:-${port}}/evolution\`
3271
3271
  **Skills**: \`/evolve\`, \`/learn\`, \`/gaps\`, \`/commit-action\`
3272
3272
  `);
3273
3273
  }