Skip to content

Commit 4860464

Browse files
committed
Merge current main and reconcile historical checkpoint board
Signed-off-by: Lihua <1017343802@qq.com>
2 parents 3d45c1b + f49b4a0 commit 4860464

682 files changed

Lines changed: 45528 additions & 3670 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎.github/workflows/dco.yml‎

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ name: DCO
22

33
on:
44
pull_request:
5+
# A required check must also report on merge-queue candidates.
6+
merge_group:
57

68
permissions:
79
contents: read
@@ -19,12 +21,15 @@ jobs:
1921

2022
- name: Require DCO trailers on contribution commits
2123
env:
22-
BASE_REF: ${{ github.event.pull_request.base.ref }}
23-
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
24+
BASE_REF: ${{ github.event.pull_request.base.ref || github.event.merge_group.base_ref }}
25+
HEAD_SHA: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }}
2426
GH_TOKEN: ${{ github.token }}
2527
shell: bash
2628
run: |
2729
set -euo pipefail
30+
# merge_group reports the base as a full ref (refs/heads/main).
31+
BASE_REF="${BASE_REF#refs/heads/}"
32+
test -n "${BASE_REF}" && test -n "${HEAD_SHA}"
2833
2934
# The event's base SHA can predate upstream commits already in the PR.
3035
# Refresh the exact target branch before selecting PR-only commits.

‎.github/workflows/full-public-smokes.yml‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ concurrency:
3131
group: full-public-smokes-${{ github.ref }}
3232
cancel-in-progress: true
3333

34+
env:
35+
LOOPX_USAGE_PING: "0"
36+
3437
jobs:
3538
full-public-smokes:
3639
if: github.repository == 'loopx-project/loopx'

‎.github/workflows/python-tests.yml‎

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ name: Python Tests
33
on:
44
pull_request:
55
types: [opened, synchronize, reopened, ready_for_review, labeled, unlabeled]
6+
# Inert until the main ruleset enables a merge queue; queue runs are full.
7+
merge_group:
68
workflow_dispatch:
79
push:
810
branches:
@@ -30,6 +32,9 @@ concurrency:
3032
group: python-tests-${{ github.ref }}
3133
cancel-in-progress: true
3234

35+
env:
36+
LOOPX_USAGE_PING: "0"
37+
3338
jobs:
3439
changes:
3540
runs-on: ubuntu-latest
@@ -102,20 +107,43 @@ jobs:
102107
cache-dependency-path: apps/presentation/dashboard/package-lock.json
103108
- run: python scripts/chat_bundle.py build --install
104109
- run: python scripts/chat_bundle.py verify --source
105-
- name: Qualify the actual compiled UI before saving the artifact
106-
working-directory: apps/presentation/dashboard
107-
run: |
108-
./node_modules/.bin/playwright install --with-deps chromium
109-
npm run smoke:personal-workspace-packaged
110-
npm run smoke:chat-turn-acceptance-retry
111-
npm run smoke:chat-upgrade
110+
# Publish as soon as the bundle is built and verified so consumers start
111+
# in parallel with browser qualification; `checks` still requires it.
112112
- uses: actions/upload-artifact@v7
113113
with:
114114
name: chat-bundle-${{ github.sha }}
115115
path: loopx/web/chat/
116116
if-no-files-found: error
117117
retention-days: 7
118118

119+
chat-bundle-browser:
120+
needs: [changes, chat-bundle]
121+
if: needs.changes.outputs.core_tests == 'true'
122+
runs-on: ubuntu-latest
123+
timeout-minutes: 15
124+
steps:
125+
- uses: actions/checkout@v7
126+
- uses: actions/download-artifact@v7
127+
with:
128+
name: chat-bundle-${{ github.sha }}
129+
path: loopx/web/chat/
130+
- uses: actions/setup-python@v6
131+
with:
132+
python-version: "3.11"
133+
- uses: actions/setup-node@v6
134+
with:
135+
node-version: "24"
136+
cache: npm
137+
cache-dependency-path: apps/presentation/dashboard/package-lock.json
138+
- name: Qualify the actual compiled UI
139+
working-directory: apps/presentation/dashboard
140+
run: |
141+
npm ci --ignore-scripts
142+
./node_modules/.bin/playwright install --with-deps chromium
143+
npm run smoke:personal-workspace-packaged
144+
npm run smoke:chat-turn-acceptance-retry
145+
npm run smoke:chat-upgrade
146+
119147
kernel-static-checks:
120148
needs: [changes, chat-bundle]
121149
if: needs.changes.outputs.core_tests == 'true'
@@ -317,19 +345,21 @@ jobs:
317345
checks:
318346
# Preserve the required check name while exposing independent failure lanes.
319347
if: always() && needs.changes.outputs.core_tests == 'true'
320-
needs: [changes, kernel-static-checks, typescript-coverage, dashboard-acceptance]
348+
needs: [changes, kernel-static-checks, typescript-coverage, dashboard-acceptance, chat-bundle-browser]
321349
runs-on: ubuntu-latest
322350
timeout-minutes: 2
323351
steps:
324352
- name: Require kernel and Dashboard qualification
325353
env:
354+
BROWSER_RESULT: ${{ needs.chat-bundle-browser.result }}
326355
DASHBOARD_RESULT: ${{ needs.dashboard-acceptance.result }}
327356
KERNEL_RESULT: ${{ needs.kernel-static-checks.result }}
328357
TYPESCRIPT_RESULT: ${{ needs.typescript-coverage.result }}
329358
run: |
330359
test "$KERNEL_RESULT" = success
331360
test "$TYPESCRIPT_RESULT" = success
332361
test "$DASHBOARD_RESULT" = success
362+
test "$BROWSER_RESULT" = success
333363
334364
node-minimum-compatibility:
335365
needs: changes
@@ -360,7 +390,7 @@ jobs:
360390
needs: changes
361391
# The unsharded full suite outlasts a PR's qualification window, so the
362392
# non-blocking probe runs on main and on demand where it can finish.
363-
if: github.event_name != 'pull_request' && needs.changes.outputs.core_tests == 'true'
393+
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && needs.changes.outputs.core_tests == 'true'
364394
continue-on-error: true
365395
runs-on: ubuntu-latest
366396
# This runs the full core conformance suite. Allow forward-runtime/runner
@@ -500,6 +530,8 @@ jobs:
500530

501531
sonar:
502532
needs: pytest
533+
# Queue refs are temporary; analyse PRs and main, not gh-readonly-queue/*.
534+
if: github.event_name != 'merge_group'
503535
uses: ./.github/workflows/sonarcloud.yml
504536
secrets:
505537
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
@@ -704,7 +736,7 @@ jobs:
704736
- uses: actions/setup-python@v6
705737
with:
706738
python-version: "3.11"
707-
- name: Verify the source-bound, browser-qualified Dashboard artifact
739+
- name: Verify the source-bound Dashboard artifact
708740
run: python scripts/chat_bundle.py verify --source
709741

710742
merge-gate:

‎AGENTS.md‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,21 @@ dependency and why the boundary improves verification or rollback. Reuse or
3636
update an existing successor; do not create ceremonial follow-up tasks for a
3737
completed request. Real authorization, cost and operational stop gates remain.
3838

39+
When a change introduces or extends a state classification, protocol literal,
40+
Enum, `Literal`, named closed set, or TypeScript `as const` vocabulary, answer
41+
whether it reuses an existing owner, extends a registered vocabulary, remains
42+
local, or creates a new shared contract. Before the full-tree semantic check,
43+
run the development-time advisory over the current diff:
44+
45+
```bash
46+
uv run python scripts/generate_semantic_inventory.py --changed-from HEAD
47+
```
48+
49+
Pass each intentional untracked source with `--include-untracked loopx/path.py`;
50+
the probe never scans untracked or ignored files automatically. Findings are
51+
review prompts, not a gate or proof of semantic equivalence, and an empty result
52+
does not cover dynamic construction or unsupported syntax.
53+
3954
For multi-Agent changes, qualify the relationship the user needs: dependency
4055
artifacts, receiver adoption, claim/lease handling, independent acceptance and
4156
result return as applicable. Sending a message or registering workers does not
@@ -245,6 +260,11 @@ gates.
245260

246261
Apply the whole-viewport attention review in `docs/development/design.md`
247262
("Earn The User's Attention") before implementation and in PR visual evidence.
263+
For production-bound interactive UI changes, carry one ordinary user task through
264+
`docs/development/frontend-delivery.md`: compare the shortest authorized journey
265+
before coding, validate the packaged interaction and owning state, and distinguish
266+
proposed changes from installed behavior. For documentation and prototypes, name
267+
the simulated boundary without claiming packaged or installed readback.
248268

249269
Before changing or reproducing any LoopX UI, read and follow the repository-root
250270
`docs/development/design.md`. This includes websites, dashboards, desktop applications,

‎CONTRIBUTING.md‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,28 @@ large or behavior-changing work whose outcome is not yet agreed.
5656

5757
Small docs typo fixes and obviously safe cleanups can go straight to a PR.
5858

59+
### Check New Semantic Vocabulary While Developing
60+
61+
If a change adds or extends an Enum, `Literal`, named closed set, TypeScript
62+
`as const` array, or another state/protocol vocabulary, run the diff-scoped
63+
advisory before the full-tree semantic check:
64+
65+
```bash
66+
uv run python scripts/generate_semantic_inventory.py --changed-from HEAD
67+
```
68+
69+
The command compares the named Git baseline with committed, staged, and working
70+
tree source changes, and reads the Git index and the working tree as separate
71+
snapshots so a staged addition survives a restored working file. It does not
72+
discover untracked files; include each intended
73+
new source explicitly, for example
74+
`--include-untracked loopx/control_plane/new_contract.ts`. It reports supported
75+
candidate carriers, registered-vocabulary reuse hints, and the disposition
76+
question to answer in review. Findings exit successfully because this is an
77+
advisory prompt, while invalid revisions, unreadable inputs, and tool failures
78+
exit non-zero. An empty report is not evidence that dynamic or unsupported
79+
semantic forms were analyzed.
80+
5981

6082
## Public And Private Boundaries
6183

‎apps/presentation/dashboard/README.md‎

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,9 @@ run in the full development and packaged personal-workspace browser smokes.
3333

3434
## Fresh Clone Public Preview
3535

36-
No private LoopX state is required for the first dashboard preview. The
37-
app bundles `examples/status.example.json` as its public-safe example source,
38-
so a fresh checkout can validate and open the UI before starting any local
39-
status server:
36+
No private LoopX state is required to validate the dashboard. The app bundles
37+
`examples/status.example.json` as its public-safe example source, and
38+
`smoke:demo-readiness` checks it without a local status server:
4039

4140
```bash
4241
cd apps/presentation/dashboard
@@ -45,15 +44,14 @@ npm run smoke:demo-readiness -- --skip-browser
4544
npm run dev:web
4645
```
4746

48-
Then open `http://127.0.0.1:5173/`. Use the bundled example source for a public
49-
demo, or switch to a loopback status URL only after you have started
50-
`loopx serve-status` locally. Do not commit `status.local.json` or live
51-
status exports; they can contain local registry/runtime paths and private
52-
project summaries.
53-
54-
`npm run dev:web` starts only the Vite UI with the bundled example. `npm run dev`
55-
also starts the loopback status and Chat services and therefore requires a
56-
Python 3.11+ interpreter; see the development section below.
47+
`npm run dev:web` starts only the Vite UI at `http://127.0.0.1:5173/`. The
48+
workspace reads `/status.json` through the Vite proxy from `loopx serve-status`
49+
on port 8766 and the Chat APIs from `loopx chat` on port 8767, so without those
50+
services it opens on a status-load error. Start them locally, or use
51+
`npm run dev`, which also starts the loopback status and Chat services and
52+
therefore requires a Python 3.11+ interpreter; see the development section
53+
below. Do not commit `status.local.json` or live status exports; they can
54+
contain local registry/runtime paths and private project summaries.
5755

5856
Personal Workspace owns Goal, Task, Chat, output, and report workflows. Run
5957
`loopx dashboard` for the installed local workspace; see the

0 commit comments

Comments
 (0)