Inspect a deterministic Phosphor display corpus
Build AG-hosted Phosphor from public source, generate its labeled presentation fixture, and read the loopback campaign index without changing governed state.
Already have an authored plan and governed run records? The newer objective read guide connects an exact Maude goal to owner-linked runs. That separately tested read path keeps unassessed criteria and unknown prerequisites explicit; it does not replace the deterministic demonstration below or qualify a complete application migration.
Prerequisites and exact inputs
- Linux x86-64, Git, Python 3, curl, and the Rust 1.94 toolchain selected by AG's committed
rust-toolchain.toml. - Allow 20 MiB for filtered source acquisition and up to 4 GiB for a fresh Cargo target. The reproduced debug-disabled target used 1,213,247,488 bytes.
- AG source
32f10101c4a93bad77d00803bad3031dd6847698and reader kit013b05d0c5258ee1bc898a51b271e47d49c4f865. The reader SHA-256 isd32b3141a072782ab68799754c17784ba89be096c56e8470186dca858e089445.
AG's lock names only the public crates.io registry for external packages. The build below uses --locked; it may contact that registry unless its exact packages are already cached and CARGO_NET_OFFLINE=true is set. Git servers may ignore partial-clone filters, so check actual source and target allocation before continuing.
Acquire and build
RUN=$(mktemp -d /tmp/phosphor-reader.XXXXXX)
git init "$RUN/ag"
git -C "$RUN/ag" remote add origin https://github.com/unpingable/constellation-ag.git
git -C "$RUN/ag" fetch --filter=blob:none --depth=1 origin 32f10101c4a93bad77d00803bad3031dd6847698
git -C "$RUN/ag" checkout --detach FETCH_HEAD
git init "$RUN/site"
git -C "$RUN/site" remote add origin https://github.com/unpingable/unpingable-site.git
git -C "$RUN/site" sparse-checkout init --no-cone
git -C "$RUN/site" sparse-checkout set /.gitignore /constellation/examples/read_phosphor.py /tools/test_read_phosphor_example.py
git -C "$RUN/site" fetch --filter=blob:none --depth=1 origin 013b05d0c5258ee1bc898a51b271e47d49c4f865
git -C "$RUN/site" checkout --detach FETCH_HEAD
test "$(sha256sum "$RUN/site/constellation/examples/read_phosphor.py" | cut -d' ' -f1)" = d32b3141a072782ab68799754c17784ba89be096c56e8470186dca858e089445
export CARGO_TARGET_DIR="$RUN/target"
export CARGO_BUILD_JOBS=1 CARGO_PROFILE_DEV_DEBUG=0 CARGO_PROFILE_TEST_DEBUG=0
mkdir "$RUN/corpus"
cd "$RUN/ag"
AG_OPERATOR_DEMO_OUTPUT="$RUN/corpus/operator-demo-corpus.json" \
cargo test --locked -j1 -p ag-app --test governed_loop_engine \
write_operator_demo_corpus_from_production_engine_fixtures -- --ignored --exact
cargo build --locked -j1 -p ag-operator-ui
The ignored generator uses production engine fixtures to write ag.operator-ui.demo-corpus/v1. The output is deterministic display data. It is not a current campaign database, owner observation, or permission.
Serve and read the exact loopback endpoint
Port 8417 must be unused. Do not stop someone else's listener or redirect this reader to another address. The initial check refuses an existing listener; each readiness iteration also checks that your own process remains present.
python3 -c 'import socket; s=socket.socket(); s.settimeout(.2); busy=s.connect_ex(("127.0.0.1",8417))==0; s.close(); assert not busy, "port 8417 is already in use"'
"$RUN/target/debug/ag-operator-ui" \
--demo-corpus "$RUN/corpus/operator-demo-corpus.json" \
--bind 127.0.0.1:8417 >"$RUN/server.log" 2>&1 &
SERVER_PID=$!
# Wait until the bounded index endpoint answers; do not rely on a fixed sleep.
for attempt in $(seq 1 60); do
kill -0 "$SERVER_PID" || exit 1
curl --noproxy '*' --fail --silent --max-time 2 --max-filesize 4194304 \
http://127.0.0.1:8417/api/v1/campaigns >/dev/null && break
test "$attempt" -lt 60 || exit 1
sleep .25
done
python3 "$RUN/site/constellation/examples/read_phosphor.py" \
--url http://127.0.0.1:8417/api/v1/campaigns \
| tee "$RUN/reader-first.json"
The reader makes one proxy-free, redirect-refusing GET with a ten-second transport timeout and a 4 MiB body limit. It accepts only ag.operator-ui.campaign-index/v1, then emits constellation.phosphor-index-summary/v1. Each campaign retains independent inspect, history, and refusals availability. Expect both shapes in this fixture:
{"availability":"available"}
{"availability":"unavailable","error_kind":"unavailable"}
An unavailable source is an owner-projection result, not an instruction to retry and not a claim that the entire campaign is unavailable.
Server loss, same-corpus recovery, and component checks
kill "$SERVER_PID"
wait "$SERVER_PID" || true
python3 "$RUN/site/constellation/examples/read_phosphor.py" \
--url http://127.0.0.1:8417/api/v1/campaigns
# expected nonzero exit: "transport failure ... Connection refused"
"$RUN/target/debug/ag-operator-ui" \
--demo-corpus "$RUN/corpus/operator-demo-corpus.json" \
--bind 127.0.0.1:8417 >"$RUN/server-restarted.log" 2>&1 &
SERVER_PID=$!
# Repeat the bounded readiness loop above, then:
python3 "$RUN/site/constellation/examples/read_phosphor.py" \
--url http://127.0.0.1:8417/api/v1/campaigns >"$RUN/reader-recovered.json"
cmp "$RUN/reader-first.json" "$RUN/reader-recovered.json"
python3 "$RUN/site/tools/test_read_phosphor_example.py"
The public-source reproduction observed a real connection refusal after stopping its owned server and byte-identical output after restarting the same retained corpus. Five small component tests passed. Their foreign schema, malformed availability and oversized-response inputs are local substitution fixtures; they are not responses observed from AG.
Stop, retain, and clean up
Stop only the process you started: kill "$SERVER_PID"; wait "$SERVER_PID" || true. Retain the exact source revisions, Cargo.lock, corpus hash, binary hash, reader outputs and server logs while diagnosing a mismatch. Do not regenerate the fixture to conceal a refusal or overwrite evidence from a different run.
When the demonstration and any diagnosis are finished, inspect the exact disposable path below. If nothing needs retention, remove that one directory using your normal file manager; it contains the source checkouts, target, corpus and logs. Do not remove another workspace or a retained user store.
printf '%s\n' "$RUN"
ls -ld -- "$RUN" "$RUN/corpus" "$RUN/target"
These pathname checks are local. The sparse partial clones may need GitHub access for additional Git operations even after installation. Do not confuse an unavailable download with loss of the retained corpus or delete records to repair it.
See the recipe comparison, composition matrix, and support guide. Support is best effort with no guaranteed response time.