Skip to content

self-development: add review-derived agent conventions - #1249

Open
kelos-bot[bot] wants to merge 46 commits into
mainfrom
kelos-config-update-latest
Open

kelos-bot[bot] wants to merge 46 commits into
mainfrom
kelos-config-update-latest

Conversation

@kelos-bot

@kelos-bot kelos-bot Bot commented May 30, 2026 •

Copy link
Copy Markdown
Contributor

What type of PR is this?

/kind cleanup

What this PR does / why we need it:

Adds evidence-backed conventions and workflow safeguards to the project
instructions, shared Kelos development AgentConfig, and reviewer prompts.

  1. Compare forwarded streams exactly. PR Stream agent output through kelos-capture instead of writing to /tmp #1189's
    review comment
    found that per-line substring assertions could not detect dropped, duplicated,
    or reordered output. The printer/formatter test rule now also requires full
    normalized equality for stream-forwarding tests.

  2. Scope autonomous triggers to trusted authors and intended subjects. PR
    Add kanon-development TaskSpawners for autonomous kanon development #1241 was corrected because a
    review trigger lacked an author filter
    and a
    PR-only command also matched issue comments.
    The TaskSpawner convention now requires both author allowlists and commentOn
    scoping where applicable.

  3. Classify request failures by cause. PR feat: add WebhookGateway CRD for per-channel webhook auth and multi-instance GitHub #1238's reviews found that
    TaskSpawner list errors silently returned success
    and
    all gateway Get errors became 404s.
    PR Support file attachments in Sessions #1630 then showed the broader form of the same mistake:
    message matching mapped server-side storage failures to 400.
    Error-to-status mappings must use typed or sentinel causes, reserve 4xx for
    client-correctable failures, and return 5xx for lookup, RBAC, storage, and
    transport failures.

  4. Honor reduced-motion preferences. PRs
    #1481
    and
    #1482
    independently added continuous running-state animation without a reduced-motion
    fallback. New nonessential animation must retain a distinguishable static state
    when motion is disabled.

  5. Protect credentials in configuration and transport. PR feat: Add native OpenTelemetry (OTLP) support for metrics and traces #1559's
    review
    found authorization headers rendered from plaintext Helm values, while PR feat: add GitHub App auth to HTTP context sources #1564's
    review
    found that an HTTP endpoint exposed a GitHub App JWT. Credential-bearing values
    must use Secret references, and their endpoints must use HTTPS unless explicitly
    opted into insecure transport.

  6. Protect state-dependent transitions from stale work. PR Add section choosers to the Session server #1548's
    review
    found that an old dialog request could mutate a newly opened Session dialog. PR
    Allow Session interruption while draining #1618's
    review
    similarly required an interrupt to be revalidated against the snapped active turn.
    PR Use inline session section selector #1649 then left a
    finding
    because an async failure path rendered a captured pre-request Session after
    polling had refreshed the selected Session. PR Add Session goal and shell commands #1650 exposed the interaction-level
    form of the same problem: a
    stale goal notification could complete a new message,
    interrupt could race goal startup,
    completion used provider-global goal state,
    and
    goal control matched the wrong active turn kind.
    PR Keep kelos logs -f open after empty streams #1654 then exposed the same precedence problem across independently updated
    lifecycle signals: a
    failed Pod was treated as retryable while Task status lagged,
    and a
    non-zero terminated container was also treated as retryable.
    Async completions and controls must re-read current state, bind to the exact
    operation identity and kind, and coordinate startup and handoff so stale work
    cannot render or mutate another operation. When lifecycle signals disagree or
    lag, terminal and failure evidence must be inspected before returning a
    transient or retry decision.

  7. Test behavior through the layer that owns it and assert the primary effect.
    PR Add section choosers to the Session server #1548's same
    review
    found that source-fragment assertions did not exercise stateful UI behavior. PR
    feat: Add optional Prometheus Operator PodMonitor to Helm chart #1560's
    review
    found that a render test never exercised the non-default namespace branch it
    claimed to cover. PR Display and manage pending Session messages #1648's
    review
    also found that an exact minified CSS-rule assertion was brittle while failing
    to exclude declarations that would restore the regression. PR Support file attachments in Sessions #1630 had a
    download fake that discarded the requested attachment ID,
    PR Monitor pull request checks in Sessions #1639 had an
    end-to-end fixture that omitted the changed check-rollup response,
    and PR Reduce Session GitHub API usage #1652 had a
    command fixture that accepted any GraphQL query and could not detect duplicate calls.
    PR Add Session goal and shell commands #1650 also had an
    interrupt test that checked journal status without checking process death,
    while PR Reduce Session GitHub API usage #1652 had a
    periodic test whose blocking callback leaked its goroutine.
    PR Keep kelos logs -f open after empty streams #1654's
    test review
    also found that new terminal, transient, and unknown lifecycle branches were
    left unvalidated.
    Tests must execute the owning layer and important non-default branches, assert
    the real routed or lifecycle effect rather than a bookkeeping proxy, and make
    appropriate static assertions on behavior instead of serialization details.
    State-dependent decision tests must cover each relevant terminal, transient,
    and unknown class plus combinations where status sources can lag one another.
    Fakes, fixtures, and command shims must exercise changed response fields,
    validate complete request shapes, reject unexpected calls, and expose call
    counts when batching or request reduction is part of the contract. Background
    goroutines and child processes must also be cancellation-aware and verified
    stopped before the test returns.

  8. Keep all documentation surfaces complete and consistent. Recent reviews
    repeatedly found partial documentation updates: PR Show sessions waiting for input #1604
    claimed header styling that was not implemented,
    PR Track sticky issue validity verdicts #1611 left
    per-spawner sections inconsistent with its overview,
    PR Paginate Session terminal history #1613
    removed documentation for still-supported flags,
    and PR Add Session turn duration separator #1616
    omitted newly observable terminal behavior.
    Agents must search related overviews, component sections, tables, setup examples,
    and command/flag references and update all affected mentions together.

  9. Separate historical replay from live event handling. PR Paginate Session terminal history #1613's
    review
    found that older terminal pages could be rendered as continuations of the active
    live stream and that duplicate history requests reused a cursor. PR Paginate Session web chat history #1621's
    review
    found that web history replay could emit a false live interruption toast, omit
    independently needed current file state, and leave viewport preservation untested.
    PR Browse Session prompts in terminal chat and console #1739's review found two related failures: the web dialog
    retried an expired cursor indefinitely,
    while the terminal
    reused cached prompt history and its cursor after reconnecting.
    The author confirmed the
    web reload fix
    and
    terminal reconnect fix,
    and the merged diff includes executable tests for both paths.
    Replay must keep its rendering, state, and side effects separate while preserving
    valid cursors, request state, current state, order, and viewport behavior.
    The history rule in AGENTS.md and self-development/agentconfig.yaml also
    requires clearing stale cursors and cached pages when reconnecting to replacement
    history or recovering from an expired cursor, so the next request starts at the
    first page. Tests must cover recovery from expired cursors as well as reconnects.

  10. Use lease-protected pushes after rebasing published branches. PR Add full spawner fleet for kelos-dev/open-actions #1622's
    reviews independently found that the
    worker existing-PR path
    and
    PR responder
    rebased already-published branches and then attempted normal pushes, which fail
    as non-fast-forward updates. The shared instructions now require
    git push --force-with-lease, never an unleased force-push, after rebasing a
    published branch.

  11. Treat controller-generated Kubernetes names as durable identities. PR
    Bound Session workload names #1629's reviews found that dropping the Session workload prefix would
    collide with legacy workloads
    and
    abandon retained persistent workspaces.
    The independent
    Kelos Claude review
    also found that a 63-character StatefulSet bound still left no room for
    ControllerRevision and Pod-label suffixes. The
    review on PR #1631
    then showed that a Session name valid under DNS-1123 can still be invalid for
    its governing Service under DNS-1035. Name derivation must validate the exact
    grammar of every generated kind and account for all downstream suffix and label
    limits, and controller-owned resources must not be renamed without a
    collision-safe migration that preserves ownership and data.

  12. Keep shared feature contracts consistent across clients. PR Support file attachments in Sessions #1630's
    review found that the plain terminal
    did not enforce the TUI's eight-file limit,
    the TUI
    accepted an empty /send that the plain terminal rejected,
    and the plain terminal
    omitted /send from command help.
    The
    independent Kelos Claude review
    also identified the cross-client limit mismatch. Shared web, TUI, and CLI
    features must apply the same limits, empty-input rules, failure semantics, and
    discoverability, with each surface tested explicitly.

  13. Preserve prompt contracts when consolidating instructions. PR Simplify session spawner prompts #1641
    removed detailed worker and PR-responder prompts on the assumption that shared
    configuration supplied the same behavior. Reviewers found the same missing-owner
    failure across
    Open Actions workers,
    Agora workers,
    the Kanon responder,
    the Agora responder,
    the Open Actions responder,
    and the Kelos responder.
    Separate comments also found the
    persistent-workspace test contract
    and
    Agora documentation
    out of sync. Before consolidating prompt instructions, agents must map every
    removed requirement to a concrete source the spawned agent actually loads and
    update contract tests and documentation in the same change.

  14. Audit responsive rules when changing web controls. Three recent web
    changes independently missed existing phone behavior:
    PR #1630 left the attachment button below the mobile touch-target size,
    PR #1638 resized the composer without resizing its adjacent attachment control,
    and
    PR #1647 omitted its new textarea from the mobile anti-zoom selector.
    Agents must sweep every relevant selector group and breakpoint override for
    new or renamed controls, preserving mobile font sizing, touch targets, and
    sibling alignment.

  15. Use production identities and collection cardinality in tests. PR
    Handle rotated CRD CA bundles during install #1656 had a
    multi-certificate review finding
    because singleton-only expected bundles did not exercise whether every
    required certificate was present. PR fix(slack): stop retrying replies rejected with cannot_reply_to_message #1660 then used an empty Task UID in
    a
    keyed-suppression test,
    so the test passed without exercising the production identity path.
    Fixtures must populate identity fields used as keys and use multi-element
    inputs when behavior depends on collection membership or aggregation.

  16. Test API mutability through updates. PR Make Session idle policy mutable #1665's
    API review
    and
    general review
    independently found that making Session.spec.idlePolicy mutable was tested
    only for one non-nil replacement. A
    separate inline finding
    also found that create-only negative cases did not prove validation remained
    enforced on updates. Mutability changes must cover the newly allowed presence
    transitions and at least one invalid update.

  17. Preserve keyboard operability in dynamic web controls. PR Add per-session actions menu to session server #1663's reviews
    found that keyboard-invoked actions
    lost focus after rerendering their trigger,
    menu items
    removed the visible focus ring,
    and
    Tab left the menu open after focus moved away.
    PR Show Task logs in the Console #1673 was then independently flagged by
    Cubic
    and the
    Kelos Claude reviewer
    because roving tabindex made the inactive Manifest tab unreachable without
    Arrow/Home/End handling. Custom widgets must implement their expected keyboard
    interaction model; dynamic menus and dialogs must also retain a visible focus
    indicator, dismiss on expected keyboard navigation, restore focus after success
    and failure, and test those interactions through the browser behavior layer.

  18. Make component renames upgrade-safe. PR Turn the Session server into the Kelos Console #1670's current-head reviews
    found that the Console rename
    dropped the persisted namespace selection
    and
    left legacy installed objects, uninstall RBAC, and Helm values without an upgrade path.
    Component renames must inventory prior deployed identifiers, migrate stored
    state, clean up resources that non-pruning installs leave behind, retain
    uninstall cleanup for old names, and reject unsupported stale configuration
    actionably. Upgrade-state tests are required alongside fresh-install tests.

  19. Test every distinct behavior path independently. PR Add Session suspend action to console #1681 reviews found that the suspend tests depended on an earlier test global, omitted a runtime dependency and could not execute, and left the idempotent API branch untested. PR Visualize resource relationships in the console #1682 then had an independent review find that an exact-set relationship test skipped core derivation branches while a dependency edge was missing. Tests must now establish their prerequisites, include runtime dependencies, prove that the intended path is reached, and inventory relevant mapping variants.

  20. Centralize behavior that must stay in lockstep. A
    review on PR #1673
    found duplicate authentication and error handling across two request helpers.
    A
    review on PR #1681
    found duplicated suspend and resume bookkeeping that could drift, and a
    review on PR #1683
    found the Console build commands duplicated instead of routed through the
    existing Makefile target. Code paths that intentionally implement the same
    behavior and differ only by an input or action must share the implementation,
    and repeated build or generation commands must use one Makefile target. The
    rule explicitly excludes incidental similarity to avoid unnecessary
    abstraction.

  21. Preserve touch-accessible actions across breakpoints. The Claude review on PR #1686 found that the mobile breakpoint hid the only touch-usable path for Session section assignment while drag-and-drop was not reliable on touch devices. An independent inline review also found that the redesigned mobile tabs fell below the established 44px touch target. Responsive changes must keep every supported action available through an equivalent touch-operable path and test that path.

  22. Preserve readable contrast across supported themes. A review on PR #1663 found that removing an explicit focus outline left only a weak dark-mode indicator, and PR #1686 reused a light-theme label color that produced roughly 2.5:1 contrast in dark mode. Color and theme changes must verify text, interactive labels, and focus indicators in every supported theme against the applicable WCAG AA contrast requirement.

  23. Preserve Unicode semantics in text processing. A review on PR #1673 found that byte-offset truncation could split a multibyte rune and emit invalid UTF-8. A review on PR #1692 then found that len() enforced a documented character threshold in bytes, causing non-ASCII false negatives and misleading diagnostics. Character limits must count Unicode code points, byte-bounded truncation must preserve UTF-8 boundaries, and affected limits must be tested with non-ASCII input.

  24. Preserve UI behavior when restructuring web views. PR Make console sidebar controls scrollable #1688 moved
    Console sidebar scrolling to a new container but left
    menu dismissal attached to the old non-scrolling list.
    PR Keep the current request visible in console #1702 later let
    hidden-view geometry updates clear current-request state without recomputing it on reveal.
    Web view restructuring must migrate behavior bindings to the actual
    containers, avoid deriving state from hidden layout geometry, recompute
    derived state when a view becomes visible, and test the affected scroll and
    hide/reveal interactions.

  25. Bound work and persisted state on long-lived data and hot paths. PR Show Task logs in the Console #1673 reviews found
    an entire accumulated WorkerPool log read into memory
    and a later
    fallback that still scanned the unbounded log.
    PR Visualize resource relationships in the console #1682 then had a
    quadratic TaskBudget-to-resource scan,
    while PR Keep the current request visible in console #1702 performed
    synchronous geometry reads and DOM writes on every scroll event,
    independently echoed by its
    Claude review.
    The current-head API review on PR API: Add TaskPipeline for multi-stage orchestration #1698 then found that
    copying every child output into CR status
    could exceed Kubernetes object-size limits and wedge status updates. Agents
    must bound long-lived input and persisted summaries, use references or
    explicit truncation for high-cardinality status, prefilter nested matching,
    and coalesce high-frequency UI work while avoiding unchanged DOM writes.

  26. Revalidate preservation data during API conversion. The resolved
    review on PR Match Slack spawner events by exclusion rules #1703 found that a user-writable preservation annotation could
    bypass the destination field's pattern and item-count schema
    after a syntactically valid JSON decode. PR Match GitHub webhook events by pull request author #1708 then repeated the same
    omission for another preserved field, where a
    current-head review found missing item-count and length validation.
    Conversion code must treat preservation storage as user-controlled, enforce
    the destination field's complete schema before restoring it, and test
    syntactically valid but out-of-schema values as well as malformed encodings.

  27. Keep configurable ServiceAccount identities in lockstep. PR feat: add WebhookGateway CRD for per-channel webhook auth and multi-instance GitHub #1238
    repeatedly exposed incomplete handling of a Helm-configurable identity: the
    gateway Pod could use a
    ServiceAccount that lacked the required RBAC binding,
    a second review found the
    same custom-name drift across rendered resources,
    and a later review found that
    reserved chart-managed names rendered duplicate ServiceAccounts.
    Helm-controlled ServiceAccount names must reach the workload, account, and
    every RBAC subject; chart-owned collisions must be rejected and both valid
    non-default and reserved values must be render-tested.

  28. Keep auxiliary failures from breaking primary work. In three PRs, a
    best-effort step broke work that would otherwise have succeeded. Each fix
    degraded only the enhancement:

    The rule in AGENTS.md and self-development/agentconfig.yaml previously
    covered only lease refresh. It now covers any best-effort enhancement: keep
    the primary result, log the failure, report it where the enhancement is shown,
    and retry later, without aborting startup or tearing down a healthy
    connection. Invalid configuration and required writes remain fail-fast. The
    Kelos reviewer did not flag the Fix console workspace changes across agents #1779 startup abort at the head cubic reviewed
    (dccd90f). Its checklist flags only silent degradation (as P1), so
    kelos-reviewer.yaml now includes the converse check at P2.

  29. Keep provider integrations isolated end to end. PR Add GitLab source and webhook support for TaskSpawners #1721 repeatedly mixed the new GitLab path with GitHub assumptions: spawner reporting received a GitHub-only token resolver, GitHub App keys could suppress GitLab token injection, and a GitLab-mode reporting controller could reconcile GitHub Tasks. A separate self-hosted URL finding, confirmed and fixed by the author, found that deriving the project path dropped the instance URL prefix. Provider additions must route credentials, configuration shapes, and work by explicit provider identity and test coexistence and self-hosted forms.

  30. Verify downloaded artifacts fail closed. Two reviews on PR Add GitLab source and webhook support for TaskSpawners #1721 found that sha256sum --ignore-missing could install an unverified glab package when its checksum entry was absent, independently flagging the Cursor image and Gemini image. Artifact verification must select exactly one checksum for the downloaded filename and fail when no unambiguous match exists.

  31. Synchronize state shared with test goroutines. PR Add GitLab source and webhook support for TaskSpawners #1721 introduced two HTTP-handler tests where handler goroutines wrote variables read unsafely by the test goroutine: the GitLab source request fixture and GitLab reporting assertions. Shared test state must use mutexes, atomics, or channels and remain clean under the race detector.

  32. Validate collection semantics in generated CRDs. PR Add GitLab source and webhook support for TaskSpawners #1721 documented
    allowed values for two list fields, but review found that the
    generated CRD omitted both item enums.
    The field-specific reviews confirmed that the markers for
    gitlabWebhook.events
    and
    gitlab.types
    did not constrain items, while another review found that
    duplicate types caused duplicate discovery work.
    Slice enums must be verified in generated YAML, and duplicate values must
    be rejected when they have no semantic meaning. The API reviewer prompts
    now check these generated collection semantics explicitly.

  33. Keep CLI resource detail output aligned with configuration. PR Add GitLab source and webhook support for TaskSpawners #1721
    repeatedly added TaskSpawner settings without exposing them to operators:
    GitLab webhook excludeAuthors was omitted,
    and the polling source hid both
    reviewState and pipelineStatus.
    New user-visible fields must be added to every applicable detail printer,
    compared with sibling provider branches, and covered by distinct full-line
    assertions. The general reviewer prompts now check this surface explicitly.

  34. Page unbounded Kubernetes and API lists. PR Remove v1alpha1 API #1725 attempted to migrate
    all stored Kelos resources with
    one unpaginated list request,
    which can fail once the API server response limit is exceeded. The existing
    bounded-work rule now requires limits and continuation-token loops whenever
    result cardinality is not contractually bounded.

  35. Keep skill discovery metadata aligned with skill behavior. Reviews on PR
    Narrow Kelos skill discovery scope #1720 found that narrowing the skill frontmatter
    left supported documentation uses undiscoverable
    and
    removed distinctive kind names needed for reliable triggering.
    Skill descriptions are now treated as discovery contracts: their positive
    terms, exclusions, and body-level usage guidance must remain aligned.

  36. Verify required filesystem outputs. PR feat: support optional skills packages #1726 accepted a successful
    required skill installation when it
    created an empty output directory,
    then a follow-up review found that its relocation loop
    silently omitted dot-prefixed entries.
    Setup and install scripts must validate usable required artifacts rather than
    only exit status or directory existence, preserve supported hidden entries,
    and exercise those postconditions with executable tests.

  37. Verify external contracts before reporting defects. Two review threads
    on PR Add GitLab source and webhook support for TaskSpawners #1721 were resolved after the author corrected unsupported assumptions:
    GITLAB_HOST accepts a URL,
    and
    head_pipeline requires the single-MR endpoint.
    The GitLab CLI documentation,
    pinned glab v1.116.0 host parser,
    and merge-request response documentation
    support those corrections. Both general reviewer prompts now require
    verification of endpoint fields and accepted inputs against the relevant
    official documentation or upstream implementation, a supporting source link,
    and omission of unverified external-contract claims. The provider-isolation
    evidence above uses the confirmed relative-URL parsing defect, so the rejected
    host-only claim is no longer presented as a valid finding.

  38. Use shared criteria for new source exclusion filters. The maintainer
    requested the same rule-based exclusion model in the
    Slack review on #1703
    and the
    GitHub review on #1708,
    and the author
    accepted the shared direction.
    Both the
    API review
    and
    general review
    then confirmed at head 1661bf4 that reusing the matcher without validating
    event-specific criteria could make a label exclusion reject every push;
    explicitly empty criteria could also become an unintended match-all rule.
    AGENTS.md and the Kelos development AgentConfig now require shared typed
    criteria under source-level excludeFilters, AND within each rule,
    rejection on any matching exclusion regardless of accepting filters, and
    preservation of shipped positive-filter semantics. Agents must validate
    empty and inapplicable criteria and test intended matches, missing attributes,
    empty values, and exclusion precedence across supported trigger paths.

  39. Keep stream control and teardown responsive under backpressure. In
    PR Add interactive shell terminals to Console sessions #1736, review found that
    blocked stdin prevented reading disconnect messages
    and that
    the bridge returned without stopping its workers.
    The author confirmed the fixes for
    bounded input and responsive control handling
    and
    cancellation, socket interruption, and worker completion;
    both threads are resolved and the merged diff contains the fixes. PR Increase Session attachment limit to 100 MiB #1735's
    download review
    also verifies that closing a stream cancels exec and unblocks a pending pipe
    write. AGENTS.md and the Kelos development AgentConfig now require control
    handling to remain responsive when consumers stall, bounded queues with
    explicit overflow handling, and bridge teardown that interrupts I/O and
    waits for its workers. Executable bridge tests must exercise blocked
    consumers, control delivery, overflow, and worker termination.

  40. Preserve UI behavior across view and resource lifecycles. In PR
    Add a native Session terminal tab with shell completion #1737, both the
    inline review
    and the independent Console review found that page departure disposed the
    terminal while leaving its tab selected and Reconnect disabled. The author
    confirmed the fix:
    close the shell, select a usable view, and allow Terminal to reopen after
    restoration. PR Add browser alerts to the console #1744 exposed another missing lifecycle transition:
    browser notifications survived Session deletion or recreation.
    The author
    confirmed cleanup by namespace/name/UID on accepted Session refreshes,
    covering selected and background Sessions. Both inline threads are resolved,
    and the merged diffs contain the accepted fixes. The existing UI convention
    in AGENTS.md and self-development/agentconfig.yaml now includes page and
    Session lifecycles, cleanup of invalid resources, usable views and controls
    after teardown, and tests for cleanup and restoration or reopening.

  41. Verify child identity before reusing a generated resource. On PR API: Add TaskPipeline for multi-stage orchestration #1698,
    both the API review
    and general review
    found that a matrix stage review and a single-Task stage review-0 could
    generate the same Task name. The AlreadyExists path checked only the
    pipeline owner, so the later stage reused the earlier stage's successful
    Task and reported success without running. The maintainer
    confirmed the fix and reconciliation test
    in merged head d823e10: reuse requires matching ownership, stage, and index;
    a different child's name collision fails explicitly. The existing generated-name
    convention in AGENTS.md and self-development/agentconfig.yaml now requires
    checking the intended child's identity as well as ownership and testing
    collisions between children of the same parent. This extends the existing
    identity guidance with a confirmed controller contract.

  42. Preserve pending UI intent and keyboard dismissal. PR Move browser notifications into console Settings #1746's Cubic review found that a pending browser-permission render reset the user's switch, keyboard focus could leave the Settings popover without dismissing it (pending state, focus dismissal), and the browser test double dropped repeated listeners (test-double semantics). The shared rules now preserve in-progress UI intent during asynchronous actions, require focus-leaving dismissal or an intentional focus trap, and require browser test doubles to preserve relevant platform semantics.

  43. Pin CSS/layout fixes with owning tests. PR Fix session conversation alignment with long headers #1747's Kelos Claude review found that the new .conversation layout declaration was not included in the existing style assertions. The shared testing rule now requires a focused assertion for each behavior-critical CSS declaration in the owning test.

  44. Guarantee that waits and lifecycle gates can finish. Three PRs shipped
    waits or lifecycle gates with no guaranteed exit. Each finding was fixed
    before merge:

    AGENTS.md and self-development/agentconfig.yaml now require:

    • releasing every owned channel, pending flag, or waiter on every exit
      path;
    • bounding waits on external work that may ignore cancellation, and
      escalating when the bound expires;
    • gating idle, drain, and interrupt transitions only on signals that reach
      a terminal state, and limiting unbounded user-work gates to the
      transitions that need them, with the effect documented;
    • keeping the access a pending drain needs;
    • testing failed, canceled, and never-finishing paths.

    The existing stale-work rule covers the wrong operation acting on shared
    state, and the backpressure rule covers only stream bridges. Neither
    requires a wait to finish.

    Two findings of the same shape are not used as evidence:

  45. Clear runtime-derived UI state across Session suspension. PR Show background task progress between Session turns #1786 adds
    a Console background-task indicator. Two reviews found live runtime state
    that outlived the runtime it described:

    • The Kelos review
      found that the count stayed visible after the Session was suspended or
      stopped being Ready. It noted that a stale active turn already had the
      same gap on main.
    • cubic
      then found that resuming restarted the elapsed-time timer for a turn
      from the stopped runtime before fresh runtime events arrived.

    The author fixed both
    (suspension,
    resume).
    An unavailable Session now clears foreground activity and the
    background-task count in the current view and its cache. Tests cover
    resume before fresh runtime events and cached-view restoration. Both
    fixes are in d3e6a82, the head that merged on October 1.

    Item 40 applied the lifecycle rule to terminals and browser notifications
    across page departure and Session deletion. It did not cover suspension or
    live activity indicators. AGENTS.md and
    self-development/agentconfig.yaml now also cover live runtime activity
    and Session suspension/resume. They require clearing runtime-derived state
    in current and cached views, and testing resume before fresh runtime events
    arrive.

  46. Grant only the access a component uses. Reviews on three merged PRs
    found RBAC permissions or credentials that reached beyond the code that
    used them. Each was fixed before merge:

    The Kelos review on #1787
    raised the sidecar token only as an optional P3 suggestion and did not
    flag the CI token. AGENTS.md and self-development/agentconfig.yaml now
    require RBAC scoped to the API calls the code makes and credentials exposed
    only to the container, process, or CI step that uses them.
    kelos-reviewer.yaml adds a matching security check: P1 when a credential
    or Secret is exposed, P2 otherwise.

  47. Recompute geometry-derived UI state on every geometry change. PR Fix console prompt jumps and add Jump to latest #1793
    added a Jump to latest button whose visibility depends on distance from
    the bottom of the conversation. Two independent reviews found that it was
    refreshed only from scroll events:

    Both fixes are in the merged commit dce3dd0. PR Keep the current request visible in console #1702 had the same
    shape:
    hidden-view geometry cleared current-request state and was not recomputed on reveal.
    That is the only non-scroll case the rule from item 24 named. In
    AGENTS.md and self-development/agentconfig.yaml, the rule now requires
    recomputing geometry-derived state whenever the underlying geometry
    changes, not only on scroll events. That covers reveal, deferred
    programmatic scrolls (after they run, not when scheduled), and late
    content growth such as image loads. It also requires testing those
    changes. The Kelos review also noted that the harness mocked the anchor
    and checked only the end state. The existing rule that browser test
    doubles must preserve platform semantics already covers that.

  48. Document the residual security risk of access changes. Kelos reviews
    on three PRs found docs for new access or authentication features that
    left out risks operators must manage. Each author fixed the gap by
    documenting it:

    The existing "Docs must match implementation" rule forbids overstated
    guarantees, which covers Add namespace membership and configuration administration to Kelos Console #1792. It does not require documenting residual
    risk the docs leave out, as in Allow Session service account updates #1774 and Add Console GitHub login with GHES endpoint support #1795. AGENTS.md and
    self-development/agentconfig.yaml now cover changes that grant
    permissions, authenticate users, or accept a trust boundary. Their docs
    must state:

    • what a compromised component or permitted identity can reach,
      including access it can grant to others;
    • whether removing upstream access ends existing sessions, and how to
      revoke them.

    kelos-reviewer.yaml is unchanged because the reviewer found all three.

  49. Preserve latest-only fields through older-version conversion. Two
    PRs added v1alpha2-only fields that a v1alpha1 read-modify-write could
    drop:

    The existing latest-version rule only says older served versions must
    stay "convertible". The preservation rule assumes preservation already
    exists and covers only validation. In AGENTS.md, the latest-version
    rule now requires preserving each latest-only field on every kind that
    carries it (spec, status, and embedded templates) and testing the round
    trip for each kind. That rule is only in AGENTS.md, which spawned
    agents in this repository load, so self-development/agentconfig.yaml
    is unchanged.

    The reviewer prompts are unchanged. The GLM review that found the feat: add Task-native budget enforcement via TaskBudget and TaskRecord CRDs #1426
    gap was later folded into the current reviewers by self-development: run every spawner on Claude Code #1762. No Kelos
    review has run on Add branchLock to let read-only Tasks skip the branch lock #1808, so there is no evidence that the current
    reviewers miss this.

    PR Support files in inline AgentConfig skills #1841 then answered the October 13 question in the notes below:
    should the rule allow a documented drop? Its first version preserved
    the new v1alpha2-only skill files in a v1alpha1 annotation. cubic
    found
    that a valid 900 KiB bundle could exceed the annotation limit, and the
    first Kelos API review rated the annotation overflow a P1. The maintainer
    replied
    "Let's not care about the compatibility of the v1alpha1." The author
    removed the annotation
    and its round-trip tests. They also added the sentence the
    API review
    asked for: reads through v1alpha1 omit files, and writes through it
    remove them. Support files in inline AgentConfig skills #1841 merged that way on October 25. docs/reference.md
    on main documents the same kind of drop for Add requestedReviewer to GitHub webhook filters #1813's
    requestedReviewer and for the pullRequestAuthor, conclusion, and
    checkName criteria. internal/conversion on main still has ten
    preservation annotations, so preservation stays the default. The rule
    now adds one exception. When the maintainer decides not to carry a
    field through older versions, agents skip its preservation and state
    the drop in the field's docs/reference.md entry. The API reviewer
    prompt is unchanged, because the Support files in inline AgentConfig skills #1841 API review already asked for
    that documentation.

  50. Bound every field of size-limited messages and objects. Three PRs
    had fields that could grow past a fixed size limit:

    Item 25 cited PR API: Add TaskPipeline for multi-stage orchestration #1698, where copying every child output into CR status
    could exceed the object size limit. The bounded-work rule covered only
    CR status. When Fix console workspace changes across agents #1779 was reviewed, no other PR had a message-limit
    finding, so no rule was added then. In AGENTS.md and
    self-development/agentconfig.yaml, the rule now covers any message or
    object with a fixed size limit, such as a streamed event line, CR status,
    or a resource's annotations. It requires:

    • keeping the payload within the limit at the maximum cardinality of
      every variable-length field;
    • counting each field's encoded size in one shared budget;
    • pruning or capping entries that accumulate per user or per child.

    The existing requirement to test bounds with realistic input sizes still
    applies. kelos-reviewer.yaml is unchanged: the Kelos reviewer flagged
    Fix console workspace changes across agents #1779 and Add explicit review scopes to console Changes tab #1828 and missed only Share Session read state across browsers #1822.

  51. Retry only failures that can clear on their own. Five PRs had a
    component retry a failure that could not succeed until an input
    changed:

    The October 14–16 window weighed Share Session read state across browsers #1822 against Bound Session workload names #1629 and Add Workspace CRD for reusable workspace configuration #37 and added
    no rule, because those two were in reconcile paths and Share Session read state across browsers #1822 was a
    client. Add Workspace options to restrict the checkout and agent credentials #1831 is a third reconcile-path finding, and a search of review
    comments since January found Implement Axon controller #1 and fix(slack): stop retrying replies rejected with cannot_reply_to_message #1660. The request-failure rule
    covered only the transient side: propagate a List/Get error so the
    sender retries. In AGENTS.md and self-development/agentconfig.yaml,
    a new rule after it covers the permanent side:

    • report a failure that cannot succeed until its spec, configuration,
      or permissions change once, where operators see it, and stop retrying
      until that input changes;
    • in reconcilers, return without an error and let a watch re-enqueue
      the object;
    • keep conflicts, rate limits, server errors, and network failures
      retryable, and test both kinds.

    A referenced object that does not exist yet is a wait, not a permanent
    failure. main requeues a Task whose Workspace is missing after 2
    seconds without an error, and Add Workspace options to restrict the checkout and agent credentials #1831's
    fix
    requeues a Task whose pool Workspace is missing. The rule exempts that
    case and leaves 404 out of its examples. The reviewer prompts are
    unchanged: the Kelos reviewer flagged Share Session read state across browsers #1822 and Bound Session workload names #1629, and no Kelos
    review ran on Add Workspace options to restrict the checkout and agent credentials #1831.

  52. Keep test outcomes independent of real time. Reviews on four PRs
    found tests whose result depended on the real clock:

    Copilot also flagged fixed sleeps on PR Implement Axon controller #1, and cubic found on PR Add cron source to TaskSpawner #40
    that a future LastDiscoveryTime made a cron test check nothing.
    Neither was confirmed fixed, so they are not used as evidence. No
    existing rule covers this: base-agent.yaml says how to respond to
    CI flakes, not how to keep a test independent of time. In AGENTS.md
    and self-development/agentconfig.yaml, a new rule after the
    test-goroutine rule requires:

    • fixtures derived from time.Now(), or an injected clock, when code
      under test compares timestamps with the current clock;
    • Eventually, Consistently, or a deadline-bounded poll on an
      observable condition instead of a fixed sleep.

    The Kelos reviewer approved feat(ghproxy): add singleflight to coalesce concurrent GET cache misses #868 and Show individual background task durations in the console #1839 without these findings, so
    kelos-reviewer.yaml now checks for them at P2.

Files updated:

  • AGENTS.md
  • self-development/agentconfig.yaml
  • self-development/kelos-api-reviewer.yaml
  • self-development/kelos-reviewer.yaml

self-development/base-agent.yaml is intentionally unchanged because none of
these changes are an upstream gjkim42/kanon-repo synchronization.

Which issue(s) this PR is related to:

N/A

Special notes for your reviewer:

The existing unassigned configuration PR was reused. It had become unmergeable
after #1762 deleted self-development/kelos-claude-reviewer.yaml and
self-development/kelos-claude-api-reviewer.yaml and folded their content into
kelos-reviewer.yaml and kelos-api-reviewer.yaml. This branch had made the same
additions to both files in each pair, so the branch was rebased onto main and
pushed with --force-with-lease. The rebase keeps the additions in the surviving
reviewers and drops the edits to the deleted files. The added lines in
AGENTS.md, self-development/agentconfig.yaml, and both surviving reviewers
are unchanged by the rebase.

Validation after the rebase:

Reviewed PR activity from September 17 through September 24. None of it
supported a new convention:

Reviewed PR activity from September 24 through September 29. Only item 28's
broadening was supported by findings in more than one PR. The update is a
fast-forward commit; main has moved on only in files this PR does not touch,
so no rebase was needed. Validation for that commit:

  • make verify — passed
  • go test ./internal/examples/... — passed
  • git diff --check — passed

Findings from this window that were not turned into rules:

Reviewed PR activity from September 29 through September 30. The only new
review activity was two further Kelos reviews on #1780, at e0a02c6 and
b9588e2. Their gate findings, together with earlier confirmed findings on
#1618, #1774, and #1780, support item 44. This is a fast-forward commit, and
main has not changed AGENTS.md or self-development/ since this branch
was last rebased. Validation for that commit:

  • make verify: passed
  • go test ./internal/examples/...: passed
  • git diff --check: passed

Findings from this window that were not turned into rules:

Reviewed PR activity from September 30 through October 1. Only #1786
supported a change (item 45). This is a fast-forward commit, and main has
not changed AGENTS.md or self-development/ since this branch was last
rebased. Validation for that commit:

  • make verify: passed
  • go test ./internal/examples/...: passed
  • git diff --check: passed

Findings from this window that were not turned into rules:

Reviewed PR activity from October 1 through October 2. Only item 46 was
added. This is a fast-forward commit, and main has not changed AGENTS.md
or self-development/ since this branch was last rebased. Validation for
that commit:

  • make verify: passed
  • go test ./internal/examples/...: passed
  • git diff --check: passed

Findings from this window that were not turned into rules:

Reviewed PR activity from October 2 through October 3. Only item 47 was
added. This is a fast-forward commit, and main has not changed AGENTS.md
or self-development/ since this branch was last rebased. Validation for
that commit:

  • make verify: passed
  • go test ./internal/examples/...: passed
  • git diff --check: passed

Findings from this window that were not turned into rules:

Reviewed PR activity from October 3 through October 7. Only item 48 was
added. This is a fast-forward commit, and main has not changed AGENTS.md
or self-development/ since this branch was last rebased. Validation for
that commit:

  • make verify: passed
  • go test ./internal/examples/...: passed
  • git diff --check: passed

Findings from this window that were not turned into rules:

Reviewed PR activity from October 7 through October 8. Only item 49 was
added. This is a fast-forward commit, and main has not changed AGENTS.md
or self-development/ since this branch was last rebased. Validation for
that commit:

  • make verify: passed
  • go test ./internal/examples/...: passed
  • git diff --check: passed

Findings from this window that were not turned into rules:

Reviewed PR activity from October 8 through October 13. None of it
supported a new convention, so this window adds no commit. main has not
changed AGENTS.md or self-development/ since this branch was last
rebased.

Findings from this window that were not turned into rules:

Reviewed PR activity from October 13 through October 14. None of it
supported a new convention, so this window adds no commit. main has not
changed AGENTS.md or self-development/ since this branch was last
rebased.

Findings from this window that were not turned into rules:

Reviewed PR activity from October 14 through October 16. Only item 50 was
added. This is a fast-forward commit. main has changed
self-development/ since this branch was last rebased: #1824 moved the
workers and PR responders to GPT-6.1 Sol and updated their READMEs. It does
not touch the files in this PR, and the PR still merges cleanly. Validation
for that commit:

  • make verify: passed
  • go test ./internal/examples/...: passed
  • git diff --check: passed

Findings from this window that were not turned into rules:

  • Share Session read state across browsers #1822: the
    Kelos review
    found that acknowledgments rejected with 403 were re-sent on every poll,
    scroll, and focus. The author
    fixed it:
    400, 403, and 404 now stop retrying, while conflicts, rate limits, server
    errors, and network errors stay retryable. A search found only an optional
    P3 on Bound Session workload names #1629 and a February cubic finding on Add Workspace CRD for reusable workspace configuration #37 about retrying permanent
    failures. Both are in controller reconcile paths, not clients, so no rule
    was added. cubic's
    follow-up,
    that pruning could delete a newer receipt, had no reply before merge. It
    is not used as evidence.
  • Add explicit review scopes to console Changes tab #1828 (open): cubic and the Kelos review both found that the new selects
    keep an 11px font on mobile, so iOS zooms when they get focus. Item 14's
    responsive rule already requires mobile font sizing that prevents focus
    zoom. The unborn-HEAD finding is specific to this feature. The Kelos
    review's two documentation P3s are covered by the documentation rules.
  • #1823 (open): both Kelos reviews found at 5bc664b that existing
    releases outside kelos-system would lose CRD conversion on upgrade.
    The author
    added a guard and migration docs,
    with render tests and a real upgrade against envtest. Item 18's upgrade
    rule already requires preserving existing deployments' state and testing
    an upgrade from prior configuration. The Kelos review's P3 that the
    adoption loop omitted two CRDs, which cubic also flagged, was fixed. The
    documentation rules cover it. The author rebutted cubic's guard-scope
    and telemetry-flag test findings. The maintainer still has to sign off on
    deleting Namespace/kelos-system by default.
  • #1824: cubic and the
    Kelos review
    found README setup steps that named OPENAI_API_KEY instead of
    CODEX_API_KEY and omitted the Codex OAuth refresh label. cubic also
    found that a test helper no longer checked the credential type and Secret
    reference. cubic reports all of them addressed. The "Docs must match
    implementation" and "Test every distinct behavior path" rules cover them.
  • #1821: cubic and the
    Kelos review
    found that the ingress header-size caveat appeared only in the GitHub
    section and not in the OIDC section. The merged README states it for
    both. The documentation-consistency rule covers this. The API review's
    suggestion to plan for a future teams list is optional.
  • cli: add opt-in pretty logs for Claude Code tasks #1794 (open): cubic's second round has seven findings and no replies
    yet. The command-level test finding is covered by "Test behavior through
    the layer that owns it", and the validate-then-refetch finding by the
    stale-work rule. The rest are specific to the log renderer.
  • feat(slack): fire TaskSpawners on emoji reactions #1807, Add branchLock to let read-only Tasks skip the branch lock #1808, feat(workspace): add clone.branches to clone only the checked-out ref #1809: only the author's reminder comments. Add the TaskRouter CRD, controller, and TaskSpawner triggerMode #1761 was
    closed by its author with no new review activity. Generated image-update
    PRs #1818–#1820 and #1825–#1827: no review comments.
  • There is still no reply to the October 13 question about whether item 49
    should allow a documented drop.

Reviewed PR activity from October 16 through October 17. None of it
supported a new convention, so this window adds no commit. main has not
changed AGENTS.md or self-development/ since the previous window, and
the PR still merges cleanly. Item 50 now records that #1828 merged with its
branch-list bound.

Findings from this window that were not turned into rules:

Reviewed PR activity from October 17 through October 18. None of it
supported a new convention, so this window adds no commit. main has not
changed AGENTS.md or self-development/ since the previous window, and
the PR still merges cleanly.

Findings from this window that were not turned into rules:

Reviewed PR activity from October 18 through October 19. Only item 51 was
added. Its commit 963bf25 fast-forwards the previous head c819a66. A
first version was pushed and replaced within minutes using
--force-with-lease, to exempt referenced objects that do not exist yet.
main has not changed AGENTS.md or self-development/ since the
previous window, and the PR still merges cleanly. Validation for that
commit:

  • make verify: passed
  • go test ./internal/examples/...: passed
  • git diff --check: passed

Findings from this window that were not turned into rules:

Reviewed PR activity from October 19 through October 20. None of it
supported a new convention, so this window adds no commit. main has not
changed AGENTS.md or self-development/ since the previous window, and
the PR still merges cleanly.

Reviewed PR activity from October 20 through October 21. None of it
supported a new convention, so this window adds no commit. main has not
changed AGENTS.md or self-development/ since the previous window, and
the PR still merges cleanly.

Findings from this window that were not turned into rules:

Reviewed PR activity from October 21 through October 22. None of it
supported a new convention, so this window adds no commit. main has not
changed AGENTS.md or self-development/ since the previous window, and
the PR still merges cleanly.

Reviewed PR activity from October 22 through October 23. None of it
supported a new convention, so this window adds no commit. main has not
changed AGENTS.md or self-development/ since the previous window, and
the PR still merges cleanly.

Findings from this window that were not turned into rules:

Reviewed PR activity from October 23 through October 24. Only item 52 was
added. Its commit 5cee024 fast-forwards the previous head 963bf25.
main has not changed AGENTS.md or self-development/ since the
previous window, and the PR still merges cleanly. Validation for that
commit:

  • make verify: passed
  • go test ./internal/examples/...: passed
  • git diff --check: passed

Findings from this window that were not turned into rules:

  • Show individual background task durations in the console #1839 merged on October 24. cubic's second round at 2580827 had two
    P2s, and both were fixed in 953943e before merge. One is item 52's
    hard-coded date. The other is a
    background task list that was not a live region,
    so screen-reader users were not told when tasks started or finished. A
    search of review comments since February found no other missing
    announcement, so no rule was added. The
    Kelos review
    approved with two P3s, and both were fixed before merge. The list was
    rebuilt every second, which "skip unchanged DOM updates" covers. No
    readLoop fixture carried a description key, which the rule that
    fixtures must exercise changed response fields covers.
  • #1840 (open): the
    Kelos review
    at dbf066e approved with four P3s. Two are specific to this feature:
    an active loop stops status.lastActivityTime from advancing, and
    scheduled runs fill prompt history. The other two are test gaps for
    overdue-run wakeups and loop.updated rendering. cubic found the same
    gaps in the previous window, and "Test every distinct behavior path"
    covers them. cubic's 12 first-round findings still have no replies.
  • #1843 (open): an external contributor fixes Tasks that stay stuck in
    deletion because a finalizer Update re-sends an immutable spec that
    no longer round-trips. cubic's only
    finding,
    a P1, says the merge patch has no optimistic lock, so a concurrent
    finalizer change can be lost. It has no reply yet, so it is not used
    as evidence.
  • Support files in inline AgentConfig skills #1841: no new review activity. Generated image-update PRs #1833, #1837,
    #1838, and #1842: no review comments.
  • There is still no reply to the October 13 question about whether item 49
    should allow a documented drop.

Reviewed PR activity from October 24 through October 25. None of it
supported a new convention, so this window adds no commit. main has not
changed AGENTS.md or self-development/ since the previous window, and
the PR still merges cleanly. base-agent.yaml still matches
gjkim42/kanon-repo's instructions/AGENTS.md.

Findings from this window that were not turned into rules:

  • #1844 (open): an external contributor adds podOverrides.runtimeClassName.
    cubic's
    P2
    says an explicit runtimeClassName: "" passes the CRD schema but
    produces a Pod that admission rejects. The author
    added MinLength=1
    in da9a568, with an integration test. No rule was added: no maintainer
    has reviewed the PR yet, and in #1058 the maintainer
    asked to remove MinLength
    from a new optional field. cubic's
    P3
    says the new reference row names only the deprecated spec.podOverrides
    path. Every other podOverrides row in that table uses the same path, so
    the PR follows the existing layout. It has no reply yet.
  • #1840, Support files in inline AgentConfig skills #1841, and #1843: no new review activity. cubic's #1843 P1 still
    has no reply. Generated image-update PRs #1837 and #1842: no review
    comments.
  • There is still no reply to the October 13 question about whether item 49
    should allow a documented drop.

Reviewed PR activity from October 25 through October 26. Only item 49 was
changed. Its commit eb9bb35 fast-forwards the previous head 5cee024.
main has not changed AGENTS.md or self-development/ since the
previous window, and the PR still merges cleanly. gjkim42/kanon-repo has
no commits since September 9, so base-agent.yaml still matches it.
Validation for that commit:

  • make verify: passed
  • go test ./internal/examples/...: passed
  • git diff --check: passed

Findings from this window that were not turned into rules:

  • Support files in inline AgentConfig skills #1841 merged on October 25. Apart from item 49's evidence, it had these
    findings:
    • The
      Kelos API review
      P2 found that the documented 1–4096 character path range allowed
      paths the kubelet rejects: a path segment over 255 bytes, or a full
      mount path over 4096 bytes. The Pod would then stay in
      ContainerCreating. The author
      added byte checks when the config is used,
      with ASCII and multibyte tests. The Unicode rule covers the
      character-versus-byte part. A search of PRs for mount path found
      only Support files in inline AgentConfig skills #1841, so no rule was added.
    • The author replied to cubic's four first-round findings on October 25.
      Removing the annotation superseded two of them: the annotation overflow
      and the round-trip assertion that accepted any skill. "Bound work and
      persisted state" covers the size check before reading each file, and
      "CLI error messages must name the resource" covers the unnamed
      --skill error.
    • The
      Kelos review
      approved with one P3. A directory argument that was itself a symlink
      failed, because filepath.WalkDir does not follow the root. The
      author fixed it with filepath.EvalSymlinks and added tests. The
      finding is specific to this command.
  • #1840 (open) was force-pushed twice on October 25 and retitled
    "Integrate native Session goals and loops across agents". It has no new
    reviews or replies.
  • #1843 and #1844: no new review activity. cubic's #1843 P1 still has no
    reply. Generated image-update PRs #1833, #1835, #1837, #1838, and #1842
    merged on October 25 with no review comments.
  • The October 13 question about item 49 is answered by the maintainer's
    decision on Support files in inline AgentConfig skills #1841, described in item 49.

Existing instructions already cover stale responses, history cursor recovery,
mobile controls, keyboard behavior, filesystem output checks, and meaningful
test coverage. PR #1749 already added screenshot guidance on main, so it is
not duplicated here. Optional or conflicting UI suggestions, isolated nits,
and speculative future capabilities were excluded. No runtime code or upstream
base-agent content changes.

Does this PR introduce a user-facing change?

NONE

🤖 Generated with Claude Code

@github-actions github-actions Bot added kind/cleanup needs-triage needs-kind Indicates an issue or PR lacks a kind/* label needs-priority needs-actor release-note-none and removed needs-kind Indicates an issue or PR lacks a kind/* label labels May 30, 2026
@kelos-bot kelos-bot Bot changed the title self-development: broaden substring-assertion convention to stream-forwarding tests self-development: add stream-forwarding and trigger-filter conventions from recent reviews May 31, 2026
@kelos-bot kelos-bot Bot changed the title self-development: add stream-forwarding and trigger-filter conventions from recent reviews self-development: add stream-forwarding, trigger-filter, and handler-error conventions from recent reviews Jun 1, 2026
@kelos-bot
kelos-bot Bot force-pushed the kelos-config-update-latest branch from 09c630c to 33e9563 Compare July 15, 2026 18:06
@kelos-bot kelos-bot Bot changed the title self-development: add stream-forwarding, trigger-filter, and handler-error conventions from recent reviews self-development: add review-derived agent conventions Jul 15, 2026
@kelos-bot
kelos-bot Bot force-pushed the kelos-config-update-latest branch from 33e9563 to 446a4b3 Compare July 27, 2026 18:10
@kelos-bot
kelos-bot Bot force-pushed the kelos-config-update-latest branch 7 times, most recently from 0a910f5 to 8d4d143 Compare August 14, 2026 18:10
@github-actions github-actions Bot added needs-release-note Indicates a PR lacks a release-note block and removed release-note-none labels Aug 14, 2026
@kelos-bot kelos-bot Bot added release-note-none and removed needs-release-note Indicates a PR lacks a release-note block labels Aug 14, 2026
@kelos-bot
kelos-bot Bot force-pushed the kelos-config-update-latest branch from 8d4d143 to db0c2c7 Compare August 15, 2026 18:10
gjkim42 and others added 2 commits September 29, 2026 18:12
Broaden the lease-refresh rule in AGENTS.md and the Kelos development
AgentConfig to cover every best-effort enhancement: a failed added lookup,
optional-view inspection, or heartbeat degrades only that enhancement with
a logged, visible diagnostic and a later retry, instead of aborting startup
or discarding a primary result. Invalid configuration and required writes
remain fail-fast.

Add the matching check to the Kelos reviewer so it weighs this case
against the existing fail-fast check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reviews on three Session runtime and controller changes found waits and
lifecycle gates with no guaranteed exit: an interaction's ready channel
left open so interrupts stalled until timeout, forced interruption that
waited unboundedly on a provider ignoring cancellation, a non-deadline
interrupt error that left a draining Session interrupting, a recreated
RoleBinding that revoked the access a drain needed, and background or
housekeeping tasks that kept a Session active and blocked idle and
update drains.

Require waiters to be released on every exit path, bounded waits with
escalation for external work, gates only on signals that terminate, and
tests for failed, canceled, and never-finishing work.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gjkim42 and others added 3 commits October 1, 2026 18:13
Reviews of the Console background-task indicator found live runtime
state that outlived the runtime it described: the background-task count
stayed visible after the Session was suspended, and resuming restarted
the elapsed-time timer for a turn from the stopped runtime before fresh
runtime events arrived.

Extend the UI lifecycle rule in AGENTS.md and the Kelos development
AgentConfig to cover live runtime activity such as progress indicators
and Session suspension/resume. Runtime-derived state must be cleared in
current and cached views once the runtime is no longer valid, and tests
must cover resume before fresh runtime events arrive.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reviews on three merged PRs found RBAC permissions or credentials that
reached beyond the code that used them: cluster-wide Secret list/watch
where named gets sufficed, an unused TaskSpawner RBAC marker on the Task
controller, a GitHub token inherited by the whole integration-test step,
and a privileged ServiceAccount token shared with an OAuth2 Proxy
sidecar. Add a least-privilege rule to the project conventions and the
Kelos development AgentConfig, and a matching security check to the
reviewer prompt, which had raised the sidecar token only as an optional
suggestion and missed the CI token.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Two independent reviews of a Console change found a scroll-position
control whose visibility refreshed only from scroll events. It was
measured before a scheduled bottom anchor ran, so it flashed visible,
and late image loads moved the bottom without a scroll event, so it
stayed hidden. An earlier review found the same gap when a hidden view
was revealed, which is the only case the existing rule named. Generalize
the rule to recompute derived state after deferred programmatic scrolls
and late content growth, and to test those changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gjkim42 and others added 2 commits October 7, 2026 18:10
Kelos reviews on three recent PRs found that docs for new access or
authentication features omitted risks operators must manage: a Session
agent could switch its own ServiceAccount, a compromised Console could
create RoleBindings granting permissions it holds, and removing a user
from a GitHub organization or team left existing Console logins active.
Each author fixed the gap by documenting it.

Require docs for changes that grant permissions, authenticate users, or
accept a trust boundary to state what a compromised component or
permitted identity can reach and how existing access is revoked.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…onversion

Two PRs added v1alpha2-only fields whose values a v1alpha1
read-modify-write could drop. One preserved the field only on
TaskSpawner templates and missed the Task itself, where immutable-spec
validation then rejects the write-back. The other left new Task status
fields unpreserved. Extend the latest-version API rule to require
preserving such fields on every kind that carries them and testing the
round trip for each kind.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
gjkim42 and others added 2 commits October 16, 2026 18:07
Reviews found unbounded fields that could push a size-limited payload
over its limit: a workspace.changes event over the Console bridge's
8 MiB line limit, and per-user Session annotations that grow until the
annotation limit rejects every write. The bounded-work rule covered only
CR status aggregation. It now covers any message or object with a fixed
size limit, requires counting every variable-length field's encoded size
in one budget, and requires pruning or capping entries that accumulate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Reviews and a production defect found components that retried
failures that could not succeed until an input changed. Reconcilers
returned errors for an unsupported spec, a permanently invalid Task, and
a foreign Service, so they requeued with backoff indefinitely. The Slack
reporter re-posted a permanently rejected reply on every 30-second
cycle. The Console re-sent read acknowledgments rejected with 403 on
every poll. The existing rule covered only propagating transient errors
so senders retry. Add the converse: report a permanent failure once
where operators see it and stop retrying until the input changes.
Reconcilers return without an error and re-enqueue from a watch. A
referenced object that does not exist yet remains a wait with a fixed
requeue, transient failures stay retryable, and tests cover both kinds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@kelos-bot
kelos-bot Bot force-pushed the kelos-config-update-latest branch from d9ea9a4 to 963bf25 Compare October 19, 2026 18:12
Reviews found tests whose result depended on the real clock. One
compared a hard-coded date with time.Now, so it passed only after that
date. Others waited for asynchronous work with fixed sleeps, which fail
on a slow runner and can pass before the behavior under test happens.
Authors replaced them with clock-relative fixtures, Consistently, or a
deadline-bounded poll. An agent-authored change shipped with the sleeps,
and the Kelos reviewer approved both that change and the hard-coded
date. Require clock-relative fixtures or an injected clock and
condition-based waits, and add the check to the reviewer at P2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The maintainer kept new AgentConfig skill files out of v1alpha1
instead of preserving them through conversion, and the merged change
states the drop in the reference. Several other v1alpha2-only webhook
filter criteria are already documented as not preserved across a
v1alpha1 round trip. Keep preservation as the default, but when the
maintainer decides not to carry a field through older versions, skip
the preservation and document the drop in the field's reference entry.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant