@sema-agent/core
Version:
Stateless, task-oriented AI agent core
377 lines (376 loc) • 10 kB
JSON
{
"repo": "core",
"version": "7.40.0",
"from": "22e5cf13b7bb519f5b50c74e9b6035693cc0e6d1",
"to": "bb53e9641e80586def0084e6a9ffdbc1dafa5c91",
"added": [],
"removed": [],
"changed": [],
"narrowed": [
{
"id": "F2",
"source": "behaviorFlips.after",
"text": "one card per such call, the Read tool's card (`askClass: \"ask_rule\"`, the same `message`), in `default` and `bypassPermissions`; `dontAsk` refuses; answered no ⇒ nothing of the search reaches the model; answered yes ⇒ the search runs and the next search of that path asks again. A search rooted ABOVE the asked path (no `path`, a relative Glob pattern) is not asked and its results are not filtered (KL-1291-a). The deny is unchanged. WHO IS HURT: a deployment or script that wrote a `Read(<path>)` ask rule and searched that path without a card (now asked; headless ⇒ refused). COMPENSATION: narrow the ask rule's pattern, or use the persisted `Read(//dir/**)` directory row for reads that need no person. IF UNCHANGED: those searches stop running without a person's answer."
},
{
"id": "F3",
"source": "behaviorFlips.after",
"text": "one card per such call, the Edit tool's card (`askClass: \"ask_rule\"`), in `default` and `bypassPermissions`; answered no ⇒ nothing is written. A Read under the asked path raises no card (read face untouched); a Write outside it raises none. The deny column is unchanged. WHO IS HURT: a deployment or script that wrote an `Edit(<path>)` ask rule and wrote under that path with Write / NotebookEdit without a card (now asked; headless ⇒ refused). COMPENSATION: narrow the rule's pattern or drop it for paths that need no person. IF UNCHANGED: those writes stop running without a person's answer."
}
],
"closedSetMembers": [
{
"set": "ASK_CLASSES",
"at": [
"src/core/ask-origin.ts:583"
],
"newSet": false,
"added": [
"unstated"
],
"removed": [],
"breaking": false,
"criteriaCovered": false
},
{
"set": "AgentTool.permissionSeat",
"at": [
"src/engine/loop/types.ts:849"
],
"newSet": true,
"added": [
"passthrough"
],
"removed": [],
"breaking": false,
"criteriaCovered": false
},
{
"set": "AskOriginFacts.tightened",
"at": [
"src/core/ask-origin.ts:115"
],
"newSet": false,
"added": [
"unstated"
],
"removed": [],
"breaking": false,
"criteriaCovered": false
},
{
"set": "ModePolicy.unstated",
"at": [
"src/core/mode-policy.ts:56"
],
"newSet": true,
"added": [
"ask",
"none"
],
"removed": [],
"breaking": false,
"criteriaCovered": false
},
{
"set": "ToolGateInput.permissionSeat",
"at": [
"src/core/hooks.ts:1804"
],
"newSet": true,
"added": [
"passthrough"
],
"removed": [],
"breaking": false,
"criteriaCovered": false
},
{
"set": "ToolSpec.permissionSeat",
"at": [
"src/core/tool-spec.ts:283"
],
"newSet": true,
"added": [
"passthrough"
],
"removed": [],
"breaking": false,
"criteriaCovered": false
}
],
"closedSetsUnreadable": [],
"typeKeys": [
{
"type": "AgentTool",
"at": [
"src/engine/loop/types.ts:768"
],
"via": "A2aRefreshResult.tools",
"added": [
"permissionSeat"
],
"addedDetail": [
{
"key": "permissionSeat",
"optional": true
}
],
"addedRequired": [],
"removed": [],
"breaking": false,
"criteriaCovered": false
},
{
"type": "HandsBandOptions",
"at": [
"src/core/hands-band.ts:106"
],
"added": [],
"addedDetail": [],
"addedRequired": [],
"removed": [
"readCyberReminder"
],
"breaking": true,
"criteriaCovered": false
},
{
"type": "ModePolicy",
"at": [
"src/core/mode-policy.ts:51"
],
"added": [
"unstated"
],
"addedDetail": [
{
"key": "unstated",
"optional": false
}
],
"addedRequired": [
"unstated"
],
"removed": [],
"breaking": true,
"criteriaCovered": false
},
{
"type": "ToolGateInput",
"at": [
"src/core/hooks.ts:1467"
],
"via": "runToolGate.ToolGateInput",
"added": [
"permissionSeat"
],
"addedDetail": [
{
"key": "permissionSeat",
"optional": true
}
],
"addedRequired": [],
"removed": [],
"breaking": false,
"criteriaCovered": false
},
{
"type": "ToolSpec",
"at": [
"src/core/tool-spec.ts:131"
],
"added": [
"permissionSeat"
],
"addedDetail": [
{
"key": "permissionSeat",
"optional": true
}
],
"addedRequired": [],
"removed": [],
"breaking": false,
"criteriaCovered": false
}
],
"typeKeysUnreadableArms": [],
"typeKeysFlattenedCount": 220,
"signatures": [
{
"name": "adjudicatePersistedPathRules",
"at": [
"src/core/permission-rule-model.ts:2309"
],
"from": [
"(rules: readonly PersistedRule[], call: { tool: string; cwd: string | undefined; sessionId?: string; }, targets: { readonly tighten?: PathTargetReading; readonly allow?: PathTargetReading; }, bases: PathRuleBases): PersistedRuleVerdict | undefined"
],
"to": [
"(rules: readonly PersistedRule[], call: { tool: string; cwd: string | undefined; sessionId?: string; face?: DenyFace | undefined; }, targets: { readonly tighten?: PathTargetReading; readonly allow?: PathTargetReading; }, bases: PathRuleBases): PersistedRuleVerdict | undefined"
],
"changes": [
{
"aspect": "param",
"detail": "param 2 `call` type widened: …ed; sessionId?: string; [ -> face?: DenyFace | undefined; ]}",
"breaking": false
}
],
"breaking": false,
"criteriaCovered": false
},
{
"name": "createAllowDenyPolicy",
"at": [
"src/core/tool-policy.ts:1299"
],
"from": [
"(opts: { allow?: string[]; deny?: string[]; onInvalidName?: \"throw\" | \"skip\"; onInvalidNameIssue?: (issue: { entry: string; list: \"allow\" | \"deny\"; message: string; }) => void; }): NamedToolPolicy"
],
"to": [
"(opts: { allow?: string[]; deny?: string[]; onInvalidName?: \"throw\" | \"skip\"; onInvalidNameIssue?: (issue: { entry: string; list: \"allow\" | \"deny\"; message: string; }) => void; scope?: \"grant\" | \"narrowing\"; }): NamedToolPolicy"
],
"changes": [
{
"aspect": "param",
"detail": "param 1 `opts` type widened: …ge: string; }) => void; [ -> scope?: \"grant\" | \"narrowing\"; ]}",
"breaking": false
}
],
"breaking": false,
"criteriaCovered": false
}
],
"declarationMoves": [],
"mintMoves": [],
"criteriaObserves": [
{
"kind": "taskEventField",
"name": "tool_end.errorCode",
"assertions": [
"G7.f"
]
},
{
"kind": "taskEventField",
"name": "tool_end.gate",
"assertions": [
"G1.b",
"G3.a",
"G7.b",
"G7.c",
"G7.e",
"G8.b",
"G8.d"
]
},
{
"kind": "taskEventField",
"name": "tool_end.output",
"assertions": [
"G9.a",
"G9.b"
]
},
{
"kind": "typeMember",
"name": "AskRequest.askClass",
"assertions": [
"G7.a",
"G8.a"
]
},
{
"kind": "typeMember",
"name": "AskRequest.classes",
"assertions": [
"G1.a",
"G2.a",
"G2.b",
"G3.b",
"G5.a",
"G5.b",
"G6.a",
"G7.a"
]
},
{
"kind": "typeMember",
"name": "AskRequest.message",
"assertions": [
"G7.a"
]
},
{
"kind": "typeMember",
"name": "AskRequest.origin",
"assertions": [
"G1.a"
]
},
{
"kind": "typeMember",
"name": "AskRequest.toolName",
"assertions": [
"G7.a",
"G7.c",
"G7.d",
"G7.e",
"G7.f",
"G8.a",
"G8.c",
"G8.d"
]
},
{
"kind": "typeMember",
"name": "Context.systemPrompt",
"assertions": [
"G9.d"
]
},
{
"kind": "typeMember",
"name": "HandsBandOptions.readCyberReminder",
"assertions": [
"G9.c"
]
},
{
"kind": "typeMember",
"name": "PendingAction.classes",
"assertions": [
"G4.a",
"G4.b"
]
}
],
"consumersHint": {
"cli": [
"ASK_CLASSES",
"AgentTool",
"AskOriginFacts",
"ModePolicy",
"ToolGateInput",
"ToolSpec",
"createAllowDenyPolicy"
],
"server": [
"ASK_CLASSES",
"AgentTool",
"ToolGateInput",
"ToolSpec",
"createAllowDenyPolicy"
],
"sdk": [
"ASK_CLASSES"
],
"note": "scanned cli@1c57a121 server@79de35f8 sdk@8ce1faa — a name listed is MENTIONED there today, which is evidence of consumption, not proof of it. Ledger files (**/docs/core-consumption/**, **/docs/wire-consumption/**, **/*LEDGER*.json) are not evidence of use — server: 3 name(s) matched ONLY in bookkeeping files and were set aside (HandsBandOptions, ModePolicy, adjudicatePersistedPathRules)"
},
"breakingCount": 2,
"breakingItems": [
"type gained required keys: ModePolicy +unstated",
"type lost keys: HandsBandOptions -readCyberReminder"
]
}