[agent/codex:gpt-5.4-mini] Read ~/spec/code/core/go/log/RFC.md fully. Find ONE feature ... #19

Merged
Virgil merged 1 commit from agent/read---spec-code-core-go-log-rfc-md-full into dev 2026-04-01 09:49:51 +00:00
2 changed files with 23 additions and 1 deletions

View file

@ -104,7 +104,7 @@ func Wrap(err error, op, msg string) error {
if err == nil {
return nil
}
wrapped := &Err{Op: op, Msg: msg, Err: err, Code: ErrCode(err)}
wrapped := &Err{Op: op, Msg: msg, Err: err, Code: inheritedCode(err)}
inheritRecovery(wrapped, err)
return wrapped
}
@ -201,6 +201,17 @@ func inheritRecovery(dst *Err, err error) {
}
}
// inheritedCode returns the first non-empty code found in an error chain.
func inheritedCode(err error) string {
for err != nil {
if wrapped, ok := err.(*Err); ok && wrapped.Code != "" {
return wrapped.Code
}
err = errors.Unwrap(err)
}
return ""
}
// RetryAfter returns the first retry-after hint from an error chain, if present.
//
// retryAfter, ok := log.RetryAfter(err)

View file

@ -124,6 +124,17 @@ func TestWrap_PreservesCode_Good(t *testing.T) {
assert.Contains(t, outer.Error(), "[VALIDATION_ERROR]")
}
func TestWrap_PreservesCode_FromNestedErrWithEmptyOuterCode_Good(t *testing.T) {
inner := WrapCode(errors.New("base"), "VALIDATION_ERROR", "inner.Op", "validation failed")
mid := &Err{Op: "mid.Op", Msg: "mid failed", Err: inner}
outer := Wrap(mid, "outer.Op", "outer context")
assert.NotNil(t, outer)
assert.Equal(t, "VALIDATION_ERROR", ErrCode(outer))
assert.Contains(t, outer.Error(), "[VALIDATION_ERROR]")
}
func TestWrap_PreservesRecovery_Good(t *testing.T) {
retryAfter := 15 * time.Second
inner := &Err{Msg: "inner", Retryable: true, RetryAfter: &retryAfter, NextAction: "inspect input"}