What works today
This page says, for each Facebook command and step, whether it is proven live,
built but untested, failing, or not built. It was read from the code, the
tests, the "Checked" lines in log.md and real run folders, as of 2026-10-22.
Read it before relying on a command, or when picking what to build next.
Where another doc says more than this page, this page is right; those docs are
listed near the end.
| Mark | Means |
|---|---|
| β | Built, unit-tested, and run live against real Facebook (or a real Twenty), with the date of the latest live run |
| π‘ | Built and unit-tested, but never run live, or not since it last changed |
| π΄ | Ran live and failed, or only partly built |
| β¬ | Not built |
1. Accounts and Twenty
| Command | State | Evidence |
|---|---|---|
log facebook accounts | β 2026-10-22 | 11 accounts from a live Twenty |
log facebook account show | β 2026-10-22 | One account |
log facebook account status | β 2026-10-20 | Set CHECKPOINT on two accounts. The replacement path (BANNED) ran only on throwaway rows, 2026-10-18. |
log facebook account resetOpens | β 2026-10-20 | All 11 accounts on 10-19, one on 10-20 |
log facebook account resave | π‘ | Never run live. The host skill gives it as the recovery path. |
log facebook lifecycle | β 2026-10-19 | Placed all 11 accounts (Twenty only, no browser) |
log facebook listings / listing | β
2026-10-18 (throwaway rows); listing create 2026-10-19 | Real listings only through create |
2. Signing in and the browser
| Command or step | State | Evidence |
|---|---|---|
log inspect start / do (AdsPower) | β 2026-10-22 | Every gate, about 37 recorded runs |
log facebook connect | β 2026-10-19, Camoufox only | Four accounts signed in ACTIVE, one RESTRICTED. The last one signed in, but saving to Twenty hit Twenty's rate limit. Never run on AdsPower. |
log facebook doctor | π‘ 2026-10-18, Camoufox | "All green" once. Never on AdsPower. |
log facebook scan | π΄ 2026-10-18, Camoufox | Only reported a login wall for an empty session. Never scanned a real account. |
log facebook status | π‘ | Never run live |
log facebook watch | π΄ 2026-10-18 | Stopped at never_connected / session_expired. Never checked a real listing. |
log proxy check / assign / balance | β 2026-10-22 | Byteful, for two accounts |
log proxy static | π‘ | Never run live |
log facebook messenger pin and the messengerPinCreate flow | β 2026-10-22 | The PIN is saved in Twenty (--show says it is set). Recorded with log inspect: Create PIN, pin, pin again; Facebook registered it (VestaServerGraphQLRegisterProviderβ¦, 200) and the inbox opened. Made into the flow messengerPinCreate, which hasn't run as a flow yet. The "Enter your PIN" screen a new device would show is mapped (messengerPinEnter: typed from Twenty) but not recorded yet. The hook runs the flow itself when the PIN is in Twenty, and flags a person only when it isn't. |
log adsPower sync / status | β 2026-10-19 | Made 10 profiles. Two capabilities are next (#43, #44): syncSessions (publish, connect and profile still launch Camoufox) and oneMachineAtATime (the per-account browser lock). |
3. The host and the account's lifecycle
| Step | State | Evidence |
|---|---|---|
log facebook host start | π΄ 2026-10-19, Camoufox only | One live day on one account: signed in, passed the account check, then failed at the profile step (/me landed on /profile.php), then opensSpent. Never run on AdsPower. |
| proxying, opening, signingIn, checkingAccount | β 2026-10-19 (Camoufox) | The same account |
| settingProfile | π΄ 2026-10-19 | pageNotReached |
| settingName | β¬ | A placeholder that returns "ok" |
| settingLocation | π‘ | Never run by the host (one account's location was set by hand in inspect) |
| warming | π‘ | Never run by the host |
| host lane: opening, watching, checking | π‘ | The host never ran its day live. Its check is now the Marketplace check below (2026-10-22), proven by hand with log facebook check, not yet inside a host run. |
log facebook check (and the host's check) | β 2026-10-22 | In the account's open browser: "You have full access to Marketplace" (profile GOOD, selling ELIGIBLE), one listing active on Selling (Twenty moved it UNDER_REVIEW β ACTIVE), seller inbox: no chats. Since 2026-10-23, each listing's clicks in the last 14 days (listing_insights) go to its clicksCount. A chat's own fields aren't mapped yet: they are kept as sent until a recording holds one. |
| acting (publish or reply as a tab) | β¬ | Returns actNotBuilt; host send can't trigger it |
| overnight, cooling | π‘ | Never reached live |
hostActors.ts (every real step) | β | No unit tests of its own; the lifecycle tests use stand-ins |
4. Marketplace: publishing, campaigns, conversations
| Command | State | Evidence |
|---|---|---|
marketplaceListingPublish flow (AdsPower) | β 2026-10-22 | A listing published from the open AdsPower browser, step by step with log inspect, then made into the flow (15 steps). Facebook held it for review; Twenty has it UNDER_REVIEW. The flow hasn't run as a flow yet. |
log facebook publish --live | β 2026-10-19, Camoufox | One listing posted, held UNDER_REVIEW, after two live tries failed on the location. The zip-location fix has never run live. It still launches its own browser instead of using the account's open one. |
log facebook campaign fill / heal / run / show | π‘ | Never run on real accounts. run --live has never run on Facebook. |
log facebook profile setup | π΄ 2026-10-19 | One real dry run: sessionExpired (checkpoint page). --live never ran through this command. The photos and names that are set were done through log flow run profileSetup. |
| profile rename | β¬ | renameNotBuilt |
log facebook conversations / conversation show|read|lead|link | π‘ Twenty only | Run against Twenty (no conversations yet) |
log facebook conversation record --file | π‘ | Fed only by a JSON file written by hand |
| Reading the Marketplace inbox and its messages | β¬ | No code opens the inbox. No inspect recording of it exists. |
| Sending a reply | β¬ | Only the Twenty fields exist |
5. Warm-up
| Activity | State | Evidence |
|---|---|---|
log facebook warmup feed (record, run --persona) | β 2026-10-20 | 33 steps, none failing, 13 posts, a like |
log facebook warmup reel (record, run) | π΄ 2026-10-20 | Swipe and openProfile failed in some runs |
log facebook warmup reel run --persona | π΄ 2026-10-20 | The latest run failed at Unmute, 0 reels. The fixes (Unmute, the profile opening in a new tab) are in the code but haven't run live. The comments-panel scroll was never recorded. |
log facebook warmup stages (the five stages) | β 2026-10-22 | With --bypass: stages record recorded all five in one browser (27 steps) and saved each as a flow (warmupFeedBrowse, warmupMarketplaceBrowse, warmupCreateAccessCheck, warmupSellingVisit, warmupMessagesVisit); stages run then ran the five flows in one browser, 27 of 27 steps, and closed with its reason logged. |
| save, follow, share | β¬ | Next: #46 |
6. Facebook groups
| Command | State | Evidence |
|---|---|---|
log facebook join group (gate, --live Join) | β 2026-10-20 | REQUESTED, 3 questions kept |
join --answer / --fill --live --submit | β 2026-10-19 | Submitted; Facebook answered QUESTIONNAIRE_COMPLETED |
log facebook read group | β 2026-10-22 for the first version | 16 posts, 8 comments. π‘ The current version (id cursor, cursor-only saves) hasn't run live. |
log facebook poll / --request | π‘ | Never run live. The group-listening service's parser accepted its records' shape. |
Acting on socialListening matches | β¬ | Next: #40 |
| The group-listening service's side (the watch, the webhook) | β¬ | Not started |
7. Recording and documenting
| Command | State | Evidence |
|---|---|---|
log flow fromInspect / docs | β 2026-10-20 | 8 flows made from recordings |
log flow run profileSetup | β 2026-10-19 | Two accounts: done |
log flow run for the other 8 flows | π‘ | Never run as flows: groupTabs, groupHeaderMenus, groupPostComments, groupPostDialog, and the four that write (profilePost, profilePhotoPost, postComment, deletePost). They were only recorded. |
log facebook capture --settle / --docs | β 2026-10-22 | 190 requests documented |
log runs / runs prune | β 2026-10-22 | Pruned 116 analysed runs, 12.5 GB, each one's findings, steps and domains kept |
log facebook capture --har | π‘ | Never run live |
log errors | β 2026-10-22 | |
log graph, log launch | π‘ | Never run live |
log login / logout / whoami | π‘ | Only a bogus token rejected, 2026-10-18; never a full sign-in |
| MCP server and agent hooks | β 2026-10-20 | MCP calls on 10-19 and 10-20; the hook reported a video selfie |
The count
| β live | π‘ untested live | π΄ failed or partial | β¬ not built | |
|---|---|---|---|---|
| The 57 commands and steps above | 26 | 16 | 7 | 8 |
Under half of what is built has been proven live. Most of what is proven is Twenty, inspect, joining and reading a group, the five warm-up stages and one publish. Almost everything that acts on its own (the host's day, connect, scan and watch on AdsPower, campaigns) hasn't been. Group reading counts as β for its first version, though the current version hasn't run live.
What the next work needs
These are the β¬ rows, and the π΄ rows that block something.
- Reading the Marketplace inbox and its messages. Nothing opens it.
- Sending a reply.
- The host acting: publish or reply as a tab in the open browser.
- The host on AdsPower, and
connect,doctor,scan,status,watchandpublishon AdsPower (syncSessions). - The per-account browser lock (
oneMachineAtATime), so two callers can't act in one browser. - Acting on
socialListeningmatches. - The profile rename, and
settingNamein the host. - The Reels persona run passing live again.
- Messenger's "Enter your PIN", when an account with a PIN meets Messenger on a new device (not seen yet). The Create PIN screens are recorded and a flow since 2026-10-22.
Done on 2026-10-22: the five warm-up stages as flows (recorded, saved, run).
How each gap gets built
The same five steps every time. Nothing is coded before step 2.
- Write down what we expect before opening anything: the page, what the account must do there, and what must be true after (the request that confirms it, what the page shows). That is the step's "must achieve".
- Record it with
log inspectin the account's open browser (AdsPower): goto, snapshot, and each click or type with--liveonly when asked. Every step keeps its snapshot, screenshot, HAR and rea's reading. - Document the requests with
log facebook capture --docs, so every request the page made is indocs/platforms/facebook/<domain>/, with what it sends and reads. - Turn the recording into a flow and its machine with
log flow fromInspect, thenlog flow runit once on the same account and read it with rea. Each step checks its "must achieve". - Wrap it as a command (
log facebook <command> β¦), an MCP tool and a README entry, with tests from the recording. Then run it live once more and mark it β here.
Applied to the first gaps
| Gap | 1. What we expect | 2. What to record with log inspect |
|---|---|---|
| Marketplace inbox and messages | The inbox lists the account's buyer threads. Each thread shows the buyer, the listing it is about, and the messages with their times. The request that carries them is named from the recording, not guessed. | Open the Marketplace inbox, snapshot, open one thread, scroll it back, snapshot. Read-only: no --live. On an account that has a real buyer thread. |
| Sending a reply | Typing in a thread and pressing send makes one message appear, and Facebook answers with the request that confirms it. | The same thread with --live and one reply text, only when asked. |
| Host acting (a tab) | A publish or a reply opens its own tab in the host's browser, does its steps there, and closes only that tab. The host's window stays open. | A recording of a publish and of a reply, each done as a new tab in an open inspect session. |
Acting on a socialListening match | For a NEW row: open the post from its link in the account that saw it, read its thread, then take the chosen action. | Open a matched post by its link and read its comments. Which action follows is decided before anything runs --live. |
Where other docs say more or less than this
| Doc | What it says | Reality |
|---|---|---|
docs/platforms/facebook/workflows.md | Reading a group is "extractor only", the command is "missing"; poll isn't listed | Both are built (see above) |
docs/groupRead.md (top) | "not yet run live end to end" | The first version ran live on 2026-10-22 |
skills/lifecycle/SKILL.md | Describes acting as working | Next: #42 |
skills/host/SKILL.md, AGENTS.md | The host "signs in by the session cookie" | It types the email and password; the cookies decide whether it is signed in |
skills/flow/SKILL.md | Lists only profileSetup as a saved flow | There are 9 |
skills/logCli/SKILL.md | "Read-only on Facebook, except publish --live" | Join, fill, submit, the --live flows and read --live also act |
docs/accountsAndListings.md, skills/logCli | Campaigns as a working flow, --live publishes them | Never run on real accounts |
src/facebook/warmup/activities/helpers/feed.ts | nextPost, likePost and openListings "not recorded yet" | They ran live on 2026-10-20 |
docs/groupListening.md:16 | log join group | log facebook join group |
Housekeeping found on the way
- The tests wrote into the real run folder (about 76 test folders). Fixed
2026-10-22:
bun testnow writes runs to a scratch folder (scripts/tests/preload.ts), and the old ones were pruned. - Recordings that are gone: the 2026-10-19 host and connect capture
folders, and
runs/flow. Only their.logfiles remain, so those runs can't be read again with rea. - Missing unit tests:
src/cli/host/helpers/hostActors.tsandsrc/warmup/viewerhave none.