Skip to content

fix: scope-rejection archives idea + activity page paginates/filters/sorts#147

Merged
jeremymanning merged 1 commit into
mainfrom
fix-activity-page-and-scope-loop
May 15, 2026
Merged

fix: scope-rejection archives idea + activity page paginates/filters/sorts#147
jeremymanning merged 1 commit into
mainfrom
fix-activity-page-and-scope-loop

Conversation

@jeremymanning
Copy link
Copy Markdown
Member

Summary

Three independent bug fixes from the previous session.

1. scope-rejection infinite loop (graph.py)

When flesh_out judged an idea out of GitHub-Actions-feasible scope, it
deleted the scope marker and rolled the project back to BRAINSTORMED,
causing the scheduler to retry the same unrecoverable idea on every tick.

Now: archive projects/<id>/idea/<file>.md to
projects/<id>/idea/.archive/<ts>-<file>.md and transition the project
to HUMAN_INPUT_NEEDED with an actionable
human_escalation_reason. Human can replace with a tighter brainstorm
or terminate. Frees the scheduler queue from these stuck projects.

2. activity page paginated + filterable

  • bumped _recent_activity limit 60 -> 500
  • each row now carries project_stage (looked up from
    state/projects/<id>.yaml)
  • new toolbar: action chips, stage select, contributor select, status
    select, ↓ Newest / ↑ Oldest sort chips, results-count chip
  • 50 entries per page with windowed page buttons (current ± 2, with
    first/last anchors + ellipses); auto-scrolls back to the panel on
    pager click
  • dropdown options populated from full payload via DOM (no innerHTML)

3. PROJ-545 broken state

PROJ-545 had current_stage: human_input_needed but
human_escalation_reason: null, which fails Pydantic validation.
Regenerated yaml with the scope-rejection reason and committed the
archive.

Test plan

  • 22 web_data unit tests pass (pytest tests/unit/test_web_data_*)
  • live site shows paginated/filterable activity page after pages.yml deploy

🤖 Generated with Claude Code

… paginates/filters; web_data exposes project_stage

graph.py: when flesh_out judges idea out-of-scope, archive idea/<file>.md
to idea/.archive/<ts>-<file>.md and transition to HUMAN_INPUT_NEEDED
with an actionable human_escalation_reason — was looping back to
BRAINSTORMED forever, blocking the scheduler queue with the same
unrecoverable project.

web_data.py: _recent_activity limit 60 -> 500; emit project_stage on each
row by looking up state/projects/<id>.yaml so the UI can filter by stage.

web/index.html + js/app.js + css/site.css: activity panel rebuilt with
action/stage/contributor/status filters, asc/desc sort chips, 50/page
pagination with windowed page buttons, and a live results-count chip.
Dropdown options populated from full payload via DOM (no innerHTML).

state: regenerate PROJ-545 yaml with the scope-rejection reason so
existing broken state passes Pydantic validation; archive the rejected
idea.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@jeremymanning jeremymanning force-pushed the fix-activity-page-and-scope-loop branch from b8cff6d to 72d6e1c Compare May 15, 2026 04:11
@jeremymanning jeremymanning merged commit b992685 into main May 15, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant