# 工程书演示：母版的两次运行录像｜爱语言 iLang
Source: https://ilang.cn/demo/

# 工程书演示

母版（Source Book）的两次真实运行，2026 年 10 月 30 日录下，在这里按引擎当时的流式输出原样回放：每一次工具调用，模型思考时的每一次停顿，回复里的每一个字。一篇粘贴进去的教程和一条小红书链接，各自变成 BOOK.md，一本任何 Agent 都能执行的英文 iLang 工程书。这一页上什么都不运行：没有模型，没有 Key，也不用你输入任何东西。

**录制** 2026-10-30 **母版** 2.8 **模型** deepseek-flash **校验器** 严格模式，两本都是零错误 [母版 2.9，当前版本](https://ilang.cn/source-book/)

## 两次运行

## 输入了什么

直接粘贴进去的教程原文

```
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.
```

## 引擎做了什么

0:00 / 1:23

## 输出了什么

BOOK.md

```
::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

Agent 给这次运行打的行动分，也就是母版要求的 S 那一行，按判断层的 f_v5 算出。

### 校验器

```
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 次模型调用 · 1 分 23 秒 · 输入 194,537 token，缓存命中 84% · token 费用约 0.10 元

## 自己跑一次

把[母版 2.9](https://ilang.cn/source-book/) 粘贴进一个能用终端、文件和网络的 Agent 应用，给它一篇教程，文字或一条链接都行，它就会同样写出 BOOK.md。也可以接上 [iLang MCP](https://ilang.cn/#use)，调用 `source_book` 提示词：母版会预先填好，`ilang_book_check` 跑的是同一个校验器。这两次运行用的是母版 2.8；当前版本 2.9 只多了反馈入口。

## 反馈

发现它出错的情况？[提交反例](https://github.com/ilang-ai/ilang-research/issues/new?template=counterexample.yml)。想改一条规则？[带上改法提交修正](https://github.com/ilang-ai/ilang-research/issues/new?template=amendment.yml)。两者都要过正典规定的门，并在 ilang-research 仓库[原样记录](https://github.com/ilang-ai/ilang-research/tree/main/records)，不由机器合并。

---

爱语言（I Language） · [掌媒科技有限公司](https://zhangmei.com) · © 2026

[鄂ICP备20005464号-25](https://beian.miit.gov.cn) | [鄂公网安备42018502008648号](https://beian.mps.gov.cn/#/query/webSearch?code=42018502008648)

MIT License · ilang:genesis:2026-03-04
