Two runs
What went in
The tutorial, pasted as text
How to publish a static site on Cloudflare Pages from a GitHub repository 1. Push your site to a GitHub repository. The site is plain HTML, CSS and JS in the repository root, with an index.html at the top level. 2. In the Cloudflare dashboard open Workers & Pages, choose Create, then Pages, then Connect to Git. Authorize Cloudflare to read the repository and pick it. 3. In the build settings leave the framework preset at None, leave the build command empty and set the build output directory to / (the repository root). Save and deploy. 4. Wait for the first build to finish. The project gets an address like your-project.pages.dev. Open it and check that index.html is served. 5. To use your own domain, open the project's Custom domains tab, add the domain, and let Cloudflare create the CNAME record in your zone. Wait until the status shows Active. 6. From now on every push to the production branch triggers a new deployment; every other branch gets a preview address.
One link
https://www.xiaohongshu.com/explore/6ad1973f0000000001008c0e
A note on free YouTube channels for cross-border e-commerce, read through RedFox, the reader the Source Book names for Xiaohongshu, Douyin and WeChat Channels links.
What the engine did
What came out
::ILANG::v5.0::ENGINEERING_BOOK
[TYPE:engineering_book]
[ID:METHOD-CF-PAGES-FROM-GITHUB]
[VERSION:1.0]
[DATE:2026-10-29]
[LANG:en]
::STATE{@USER, role:site_owner, has:a_cloudflare_account_and_a_github_account, may_have:a_domain_already_in_cloudflare, does:decide_authorize_pay}
::STATE{@AGENT, role:the_user_s_own_AI, can:shell_git_browser, does:prepare_push_click_through_the_dashboard_verify, never:runs_a_step_before_the_user_says_go}
::STATE{@RUNTIME, version:2026.10.25-082851760176, note:the_iLang_runtime_this_book_was_written_against_and_its_grammar_wins_over_this_text}
::OBJECTIVE{id:g1|owner:user|trust:trusted|version:1|status:active}
target: the plain site in FILL_SITE_DIR is published from FILL_REPO by Cloudflare Pages and answers at its pages.dev address, with FILL_DOMAIN on it when one is given, and every push to FILL_BRANCH publishes again
ACCEPT: R1 and R2 and R3 and R4 and R5 pass
NON_GOALS: designing or rewriting the site, writing its content, moving it to another host, buying a plan or a domain
DONE_WHEN: the addresses answer and the report was printed as six lines
::BOUNDARY{never:put_a_token_password_or_key_in_the_repository_or_in_the_site_folder|scope:permanent}
::BOUNDARY{never:change_nameservers_or_delete_the_repository_or_the_project_without_the_user_saying_go|scope:permanent}
::BOUNDARY{never:add_a_card_start_a_paid_plan_or_buy_a_domain_that_is_the_user_s_decision|scope:permanent}
::BOUNDARY{never:call_a_build_done_from_the_click_alone_a_served_page_is_the_evidence|scope:permanent}
::STATE{@INPUT, FILL_SITE_DIR:the_local_folder_whose_top_level_holds_index.html, FILL_REPO:the_GitHub_repository_as_owner/name_created_when_absent, FILL_PROJECT:the_Cloudflare_Pages_project_name, FILL_BRANCH:the_branch_whose_pushes_publish_production, FILL_DOMAIN:the_custom_domain_or_the_word_none}
::MODULE{HOW|title:publish the site}
[STEP] 1 READ FILL_SITE_DIR and expect index.html at its top level beside the CSS and JS; not there: ask the user which folder holds the site and stop
[STEP] 2 RUN in FILL_SITE_DIR the git commands that commit and push to FILL_REPO and expect the files on FILL_BRANCH; repository absent: create it empty with no readme and push again
[STEP] 3 OPEN the Cloudflare dashboard on Workers and Pages then Create then Pages then Connect to Git, authorize the GitHub account on FILL_REPO and expect the repository listed and chosen
[STEP] 4 SET the build settings to framework preset None, build command empty, build output directory the repository root, then deploy and expect a build log that ends in a success line
[STEP] 5 GET the pages.dev address the project shows, open it and expect the index page served, not a directory listing and not an error page
[STEP] 6 SET the custom domain when FILL_DOMAIN is not none: project Custom domains tab, add FILL_DOMAIN, let Cloudflare write the CNAME record in its own zone, expect the status Active
[STEP] 7 RUN one further commit on FILL_BRANCH and expect a new production deployment, with a preview address for a commit on any other branch
[STEP] 8 CHEK R1 to R5 on what is live rather than on what was clicked and expect each item pass or a named gap
[IF] the first build fails
[THEN] open the build log, correct the build output directory or the file layout the log names, push again, and keep the project
[IF] FILL_DOMAIN sits on nameservers outside Cloudflare
[THEN] stop at the record Cloudflare shows, print it for the user, and let the user place it
[IF] a screen asks for a card, a plan or a confirmation the agent cannot give
[THEN] stop and hand that one decision to the user
[NOTE] confirmed in the Cloudflare Pages build configuration documentation: a project with no framework leaves the build command blank, and the build output directory names the folder holding the files to serve, which for this site is the repository root
[NOTE] confirmed in the Cloudflare Pages preview deployments and custom domains documentation: commits to the production branch update the pages.dev address, other branches get preview addresses, and a domain already in the Cloudflare zone gets its CNAME record written by Cloudflare
::MODULE{REPORT|title:the six lines the agent prints at the end}
[LINE] one sentence in the user_s language saying where the site now answers
[LINE] the pages.dev address that answered
[LINE] every change made to the repository and to the dashboard on one line, or the word nothing
[LINE] the custom domain status word, or the word skipped
[LINE] the rubric ids that passed and, on that same line, each id that did not with its gap
[LINE] S= the f_v5 STEP-4 action score of what the agent did, to two decimals
::RUBRIC{id:R1|title:the site folder holds index.html at its top level|check:cmd|run:"test -f FILL_SITE_DIR/index.html"|expect:0}
::RUBRIC{id:R2|title:the pages.dev address serves the site|check:cmd|run:"curl -fsS -o /dev/null https://FILL_PROJECT.pages.dev/"|expect:0}
::RUBRIC{id:R3|title:the served page is the site and not an error page or a listing|check:human}
::RUBRIC{id:R4|title:the custom domain answers or was skipped and recorded|check:human}
::RUBRIC{id:R5|title:the report was printed as six lines ending in the score|check:human}
::FALLBACK{no_git_or_no_github_access then ask_the_user_to_push_the_folder_or_grant_access_then_continue_from_step_3|a_dashboard_step_the_agent_cannot_click then print_the_setting_the_user_must_choose_and_wait|the_build_fails_twice then stop_and_name_the_error_line_for_the_user}
::PRIORITY{
user_decision > BOUNDARY > OBJECTIVE > RUBRIC > RULE
}
::ILANG::v5.0::ENGINEERING_BOOK
S=0.89
The agent's own action score for the run, the S line the Source Book asks for, by the judgment layer's f_v5.
Validator
exit code 0 BOOK.md: 0 error(s), 0 warning(s) | mode=raw fences linted=0 skipped=0 annotations=0 TOTAL: 0 error(s), 0 warning(s) in 1 file(s)
7 model calls · 1 min 23 s · 194,537 prompt tokens, 84% cached · about ¥0.10 of tokens
Run it yourself
Paste Source Book 2.9 into an agent app that has a shell, files and the web, give the agent a tutorial as text or one link, and it writes BOOK.md the same way. Or connect the iLang MCP and ask for the source_book prompt: the book comes filled in, and ilang_book_check runs the same validator. These runs used Source Book 2.8; 2.9, the current version, adds only the feedback entry.
Feedback
Found a case where it fails? File a counterexample. Want a rule changed? File an amendment with the fix. Both run the gates the canon defines and are recorded verbatim at research; nothing is merged by a machine.