Skip to content

Dogfood Frame #102–#105 on Factory status and Pending preview - #11

Merged
howlcipher merged 1 commit into
mainfrom
cursor/factory-frame-dogfood-3dc2
Sep 29, 2026
Merged

howlcipher merged 1 commit into
mainfrom
cursor/factory-frame-dogfood-3dc2

Conversation

@howlcipher

@howlcipher howlcipher commented Sep 29, 2026 •

Copy link
Copy Markdown
Owner

Consumer dogfood of HowlFrame #102–#105. No new Frame opcodes. Factory status and the Pending preview are the Board path that now uses the surface that landed on howlframe main. This does not start Factory, take the supervisor lock, write a queue, or trust owner_direction. howlplane #122 is untouched.

factory-status-fixture-and-pending-preview.mp4

What was swapped

Factory status used to select published vs fixture with POST {"source":...} because the request surface was body-only. The selector is now a request read:

  • GET /api/factory/status/{source} via req_path (what the panel calls)
  • GET /api/factory/status?source= via req_query
  • X-Howlboard-Factory-Source via req_header

Path wins, then query, then header. A missing selector is "" (map_get's absence sentinel) and means published. A JSON body is not a selector.

Status text fields and blockers are copied by walking map_keys against an allowlist. Unknown keys, including a private note on a blocker, do not reach the response.

Tip lock accepts {"sha":"..."} or {"commit":{"sha":"..."}}. The nested read is chained map_get, and it runs only after the intermediate is present, because a miss is "" and map_get of that string is TYPE_ERROR.

The Factory panel (frontend/factory_view.howl) uses html_escape for text and attr_escape for data-provenance, data-class, and data-markdown. It does not build an inline handler. Mission rendering still uses the hand-rolled esc. The Pending preview is still a POST: it submits a row, it does not read a selector.

/api/projects is still a list of records. That public shape was left alone.

How to verify

git clone --depth 1 https://github.com/howlcipher/howlframe.git /tmp/howlframe
cd /tmp/howlframe && go build -o /path/to/howlboard/howlframe_bin howlframe.go
cd /path/to/howlboard
make build
make test
make run

In a second terminal: make run-frontend. Open http://localhost:3000.

  1. With no file at data/factory/status/remote-snapshot.json, the Factory panel reports published Plane tip status, or unknown if that tip cannot be read. Nothing was started.
  2. Refresh factory status requests GET /api/factory/status/published.
  3. Preview fixture snapshot requests GET /api/factory/status/fixture. The badge says FIXTURE, campaign abc123, and the three blocker classes are shown.
  4. Preview Pending row (the form is prefilled) prints a row whose status cell is exactly Pending.

The same fixture read is curl -s 'http://localhost:8080/api/factory/status?source=fixture' and curl -s -H 'X-Howlboard-Factory-Source: fixture' http://localhost:8080/api/factory/status. curl -s -X POST -d '{"source":"fixture"}' http://localhost:8080/api/factory/status does not select the fixture.

To show artifacts inline, enable in settings.

Open in Web Open in Cursor 

Factory status selected its snapshot with a POST body, copied dict fields
by hand, and the panel escaped HTML with str_split. This path now uses
req_path, req_query, req_header, map_keys, chained map_get, html_escape,
and attr_escape. It stays a projection: no Factory start, lock, queue
write, or owner_direction.

Co-authored-by: William Elias <wylelias.123@gmail.com>

@howlcipher howlcipher left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dev Lead: APPROVE with nits for Frame #102–#105 dogfood.

Projection-only path looks correct: path/query/header source selection (POST body no longer selects), map_keys allowlists drop private blocker notes, tip lock chains map_get only after a present intermediate, and factory_view uses html_escape/attr_escape with constant handlers only. Caps and Factory start/lock/queue/owner_direction boundaries are unchanged; contract tests cover the selector matrix, fixture/pending, and escapes; CI green on a3c8525.

Nits (non-blocking): architecture diagram should name factory_view.howl; a non-dict commit tip negative test would lock the TYPE_ERROR catch path. Undraft + squash-merge when ready.

@howlcipher
howlcipher marked this pull request as ready for review September 29, 2026 23:53
@howlcipher
howlcipher merged commit e96d055 into main Sep 29, 2026
1 check passed
@howlcipher
howlcipher deleted the cursor/factory-frame-dogfood-3dc2 branch September 29, 2026 23:53
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.

2 participants