Research limit: a new version of an active effort is never refused; holds and tool text follow (issue 1970, ADR 0629)

Claude-Session: https://claude.ai/code/session_01JG73KG7AfSdh6FP8VrBqCn
This commit is contained in:
2026-11-04 14:32:27 +01:00
parent b0a275c126
commit 29f6039fb1
3 changed files with 19 additions and 5 deletions
@@ -397,7 +397,7 @@ func (k *KB) Propose(caller string, a ProposeAsk) (*Proposed, error) {
if !current && a.Kind == KindResearch && r.Effort == "" {
r.Effort = held.Current.Status
}
if a.Kind == KindResearch && r.Effort == StatusActive {
if a.Kind == KindResearch && r.Effort == StatusActive && (held == nil || held.Current.Status != StatusActive) {
if why := k.activeLimitRefusal(ctx, key); why != "" {
refusals = append(refusals, Refusal{Rule: "research-active-at-most", Says: why})
}
@@ -446,7 +446,7 @@ func (k *KB) Propose(caller string, a ProposeAsk) (*Proposed, error) {
return &Proposed{Record: key.String(), Version: n, Status: StatusProposed, Says: says + "."}, nil
}
// activeLimitRefusal (ADR 0629 §4, a check of the record set beside the one-record rules of ADR 0290 §4) says why a research effort may not be active now: the limit of efforts other than this one
// activeLimitRefusal (ADR 0629 §4 names only a new effort or one taken up from an idea, never a new version of an active one; a check of the record set beside the one-record rules of ADR 0290 §4) says why a research effort may not be active now: the limit of efforts other than this one
// already active (accepted at active, or proposed at active and waiting for review) is reached (ADR 0629). Empty
// when it may.
func (k *KB) activeLimitRefusal(ctx context.Context, key Key) string {