docs: plan node flows and record follow-up qualification
This commit is contained in:
@@ -0,0 +1,82 @@
|
|||||||
|
# IndeeHub distributed viewing: protocol review
|
||||||
|
|
||||||
|
Status: preliminary design, 2026-10-05. Not implemented or qualified. Reconcile
|
||||||
|
with actual IndeeHub source before selecting the final event/API contract.
|
||||||
|
|
||||||
|
## Updated constraints
|
||||||
|
|
||||||
|
The older `phase4-streaming-ecash-plan.md` mixes producer content sales with
|
||||||
|
bandwidth resale and an optional iroh swarm. Its implementation assertions are
|
||||||
|
historical. The operator now requires FIPS for inter-node media bytes, producer
|
||||||
|
payments, timed viewing, and an Archipelago catalog across instances. A successful
|
||||||
|
bandwidth payment alone must not unlock a producer's protected film.
|
||||||
|
|
||||||
|
The old document also describes a fail-open paid-serving path. Audit the current
|
||||||
|
implementation; never adopt fail-open behavior for paid media or key delivery.
|
||||||
|
Keep free software updates outside any paid-content gate.
|
||||||
|
|
||||||
|
## Primary specifications checked
|
||||||
|
|
||||||
|
- [NIP-71 video events](https://github.com/nostr-protocol/nips/blob/master/71.md):
|
||||||
|
defines ordinary and addressable video metadata, including variants. Evaluate
|
||||||
|
addressable normal-video events for stable film identity and metadata updates.
|
||||||
|
This is a draft optional specification, not a complete rental/access protocol.
|
||||||
|
- [NIP-94 file metadata](https://github.com/nostr-protocol/nips/blob/master/94.md):
|
||||||
|
describes file hashes, MIME types, sizes and locations. Reuse compatible fields
|
||||||
|
rather than inventing incompatible meanings for standard tags.
|
||||||
|
- [Blossom BUD-01](https://github.com/hzrd149/blossom/blob/master/buds/01.md):
|
||||||
|
specifies SHA256-addressed HTTP blob retrieval. Its public cross-origin server
|
||||||
|
conventions must not be copied onto dashboard/RPC authentication boundaries.
|
||||||
|
Hash addressing can complement a FIPS-backed gateway; Blossom alone does not
|
||||||
|
establish payment or timed viewing rights.
|
||||||
|
- [Cashu NUT-18](https://github.com/cashubtc/nuts/blob/main/18.md): receiver requests
|
||||||
|
can describe amount, unit, accepted mints and token delivery. Reconcile supported
|
||||||
|
mint preferences/methods with our deployed wallets, not just the latest schema.
|
||||||
|
- [NUT-04](https://github.com/cashubtc/nuts/blob/main/04.md) and
|
||||||
|
[NUT-23](https://github.com/cashubtc/nuts/blob/main/23.md): verify current mint
|
||||||
|
quote/payment accounting and BOLT11 behavior against supported mints. Keep quote
|
||||||
|
identifiers private. Successful invoice payment and successful token issuance
|
||||||
|
are distinct recovery steps; never repeat payment to recover an issuance reply.
|
||||||
|
|
||||||
|
These are source/specification findings. Compatibility with existing clients and
|
||||||
|
mints remains to be tested. Pin specification revisions when implementing so a
|
||||||
|
moving document cannot silently change the wire contract.
|
||||||
|
|
||||||
|
## Proposed separation of responsibilities
|
||||||
|
|
||||||
|
1. **Discovery:** publisher-authorized signed metadata; stable film/version ID,
|
||||||
|
public title/artwork/teaser and explicit supported paid-content extension.
|
||||||
|
Deduplicate, reconcile updates/deletions and recover missed events. Do not put
|
||||||
|
private viewing keys, receipts, quotes or wallet credentials on public relays.
|
||||||
|
2. **Producer offer and settlement:** reuse recipient-capability negotiation from
|
||||||
|
file purchases. Bind amount, recipient, content version and duration to one
|
||||||
|
durable purchase ID. Verify settlement at the seller before issuing access.
|
||||||
|
Support the existing Lightning-to-ecash-address flow without requiring LND.
|
||||||
|
3. **Viewing entitlement:** a versioned authenticated grant with content, buyer,
|
||||||
|
validity and replay rules. This is application-specific until interoperability
|
||||||
|
is demonstrated; do not present it as defined by the metadata/payment NIPs.
|
||||||
|
4. **Playback gateway:** browser/companion use normal authenticated media requests
|
||||||
|
to their node. The node obtains protected segments over FIPS and verifies
|
||||||
|
content integrity and entitlement. Seek/retry/resume reuse the purchase.
|
||||||
|
5. **Caching:** peers may cache authorized ciphertext. Key delivery and subsequent
|
||||||
|
segment access remain gated. Already delivered plaintext or keys cannot be
|
||||||
|
made uncopyable or retroactively revoked; do not promise DRM guarantees.
|
||||||
|
|
||||||
|
No silent media fallback to Tor/LAN/iroh satisfies the operator's FIPS requirement.
|
||||||
|
If FIPS is unavailable, retain paid ownership and explain retry/recovery rather
|
||||||
|
than charge again. Separate routing diagnostics from normal playback controls.
|
||||||
|
|
||||||
|
## Decisions and proofs required before publishing the test film
|
||||||
|
|
||||||
|
Identify the exact Yaya Cloud video, preserve its original and obtain the intended
|
||||||
|
price and viewing-window semantics. Define activation versus expiry, clock skew,
|
||||||
|
multiple devices, publisher outage, refund policy and content-version replacement.
|
||||||
|
Use isolated/regtest funds for automated tests; new real payments require a bounded
|
||||||
|
amount authorization. Publish no unrelated Cloud file.
|
||||||
|
|
||||||
|
Qualification must cover settlement with lost replies, duplicate payment callbacks,
|
||||||
|
wrong mint/recipient/content, denied keys, expired grants, FIPS outage and recovery,
|
||||||
|
range/HLS seek, mobile background/resume, source/peer restart and storage recovery.
|
||||||
|
Verify actual transport and producer balance changes rather than relying on UI
|
||||||
|
labels. Include fresh/upgrade tests and any required IndeeHub image/catalog update
|
||||||
|
at the end of the implementation.
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
# Node connection flow plan
|
||||||
|
|
||||||
|
Status: proposal for the post-1.9.0 work. Uses existing components, colors,
|
||||||
|
spacing, glass cards, typography and motion. No broad navigation redesign has
|
||||||
|
been deployed. Connection reliability must be qualified before this flow ships.
|
||||||
|
|
||||||
|
## Entry and return paths
|
||||||
|
|
||||||
|
- Web5 always exposes **Connect with Nodes**, including when mobile quick actions
|
||||||
|
are collapsed. Keep **Connected Nodes** beside the entry or directly below it.
|
||||||
|
- Cloud peer files links to the same connection flow and retains its return
|
||||||
|
location. Successful connection returns to that peer's files when appropriate.
|
||||||
|
- Fleet provides the same connection entry, with an explicit distinction between
|
||||||
|
connecting to another person's node and linking a node the operator owns.
|
||||||
|
- Open the route immediately with cached safe summaries or a loading state;
|
||||||
|
discovery and transport checks run after navigation. Do not await remote calls
|
||||||
|
before rendering the destination. Cancel obsolete work on navigation away.
|
||||||
|
|
||||||
|
## Connect with Nodes
|
||||||
|
|
||||||
|
Use one page with existing tabs: **Discover**, **Requests**, **Connected**.
|
||||||
|
On mobile keep tabs in one horizontally scrollable row. Preserve the selected
|
||||||
|
view, search and scroll position when opening a node and returning.
|
||||||
|
|
||||||
|
Discover shows the existing opt-in Nostr presence results and an explicit invite
|
||||||
|
entry. Search updates locally; refresh provides immediate progress, timeout and
|
||||||
|
retry feedback. Distinguish stale advertisements from recently contacted nodes.
|
||||||
|
A presence event is discovery information, not authorization or proof of reachability.
|
||||||
|
|
||||||
|
Each node has a single clear action: Request connection, View request, or Open
|
||||||
|
node according to its actual state. Explain what information the request shares.
|
||||||
|
Avoid duplicate requests on repeated taps or when responses arrive late.
|
||||||
|
|
||||||
|
## Requests and approval
|
||||||
|
|
||||||
|
Display incoming and sent Nostr requests in the same Requests view, with counts
|
||||||
|
and a readable node identity/name. Incoming requests offer Approve or Reject;
|
||||||
|
sent requests offer Cancel. Keep completed history available but secondary.
|
||||||
|
|
||||||
|
An approval progresses through distinct states:
|
||||||
|
|
||||||
|
1. Request sent / Awaiting approval.
|
||||||
|
2. Approved / Connecting — authenticated invitation accepted, join not confirmed.
|
||||||
|
3. Connected — persisted relationship and authenticated reciprocal confirmation.
|
||||||
|
4. Connection delayed — show bounded retry and a useful error; retain the approved
|
||||||
|
operation so restart, lost acknowledgement or transient outage can recover.
|
||||||
|
|
||||||
|
Do not label relay acceptance as peer connection. A retry must reuse the same
|
||||||
|
logical operation, prevent duplicate peers and retain the operator's trust choice.
|
||||||
|
Cancellation/rejection delivery failures must be visible rather than reported as
|
||||||
|
successfully notified. Define recovery for already-approved legacy requests.
|
||||||
|
|
||||||
|
Normal discovery connections grant Observer access. **Link your own nodes** must
|
||||||
|
be a separate explicit flow with existing ownership/authentication requirements;
|
||||||
|
being reachable over FIPS never grants Trusted access or remote management rights.
|
||||||
|
|
||||||
|
## Connected nodes and Fleet
|
||||||
|
|
||||||
|
Show actual connection state and last successful authenticated contact. Distinguish
|
||||||
|
**Offline**, **Connecting**, **Unknown** and **Metrics unavailable**. Last report
|
||||||
|
age alone does not establish when a node went offline. Future/skewed timestamps
|
||||||
|
must not make a node permanently online.
|
||||||
|
|
||||||
|
Default ordering: online, connecting, unknown, confirmed offline; stable ordering
|
||||||
|
within groups. Honor manually selected sorting/filtering and do not disrupt the
|
||||||
|
user's selection while metrics update. Offline rows show last contact; show an
|
||||||
|
"offline for" duration only when an observed transition supports it.
|
||||||
|
|
||||||
|
The existing network map uses matching status labels and accessible details;
|
||||||
|
color alone is insufficient. Node detail keeps Connect/Retry, Files and permitted
|
||||||
|
management actions together. Do not add duplicate connection mechanisms.
|
||||||
|
|
||||||
|
## Acceptance before deployment
|
||||||
|
|
||||||
|
- Two real nodes: request, approval, reciprocal connection and persisted lists.
|
||||||
|
- Retry after lost reply, duplicate/reordered events, restart on each side,
|
||||||
|
unavailable relay, FIPS outage and supported transport recovery.
|
||||||
|
- Invalid signatures, unsolicited invites, wrong identities, stale/cancelled
|
||||||
|
requests and blocked peers cannot gain access or elevate trust.
|
||||||
|
- Desktop and actual companion: first connection, revisit, back navigation,
|
||||||
|
search, tab switching, refresh, background/resume and interrupted network.
|
||||||
|
- Measure tap-to-feedback, first usable content, discovery completion and
|
||||||
|
approval-to-confirmed-connection before and after. Preserve unknown data.
|
||||||
|
- Operator UAT gives exact nodes, steps and expected states; no extra payment or
|
||||||
|
wallet/channel changes are needed for connection testing.
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
# Post-1.9.0 reliability investigation
|
||||||
|
|
||||||
|
Status: implementation and qualification in progress. These changes are on
|
||||||
|
`work/post-190-reliability`, separate from the published 1.9.0-alpha artifacts.
|
||||||
|
Nothing here constitutes live acceptance or permission to change peer trust.
|
||||||
|
|
||||||
|
## Peering: approved request does not establish a relationship
|
||||||
|
|
||||||
|
Read-only inspection on 2026-10-05 reproduced the operator's report: the receiving
|
||||||
|
node retains an approved inbound request while the requesting node retains its
|
||||||
|
outbound request in Sent state; neither has the reciprocal federation entry.
|
||||||
|
Both have discoverability enabled. FIPS is running on both (different service
|
||||||
|
names); checking only `fips.service` would incorrectly report one as inactive.
|
||||||
|
|
||||||
|
Source discrepancy: request publication and polling use `handshake_relays()`,
|
||||||
|
which combines managed relays and configured defaults. Approval, rejection and
|
||||||
|
cancellation instead use only configuration defaults. Align all three reply
|
||||||
|
paths with the shared resolver. Add an actual-handler integration test with a
|
||||||
|
UI-configured local WebSocket relay, signed event verification, recipient-only
|
||||||
|
NIP-44 decryption, reply types, persisted request states and Observer-only approval.
|
||||||
|
The isolated test passes: all three reply types reach the managed-only relay,
|
||||||
|
and a rejected approval remains Pending with no peer added. The complete backend
|
||||||
|
suite is running; actual-node handshake recovery remains outstanding.
|
||||||
|
|
||||||
|
This discrepancy is not yet a proven complete explanation of the live failure.
|
||||||
|
Read-only relay queries are being checked. Other source risks requiring separate
|
||||||
|
qualification include best-effort peer-joined callbacks without durable retry,
|
||||||
|
five-minute background polling, latest-50-event fetching without a cursor, and
|
||||||
|
pending-file read/modify/write operations without serialization. Do not manually
|
||||||
|
mark requests completed or elevate trust to make the UI appear connected.
|
||||||
|
|
||||||
|
## Web5 navigation cleanup
|
||||||
|
|
||||||
|
The Wallet quick-action only toggles a local disconnected flag and refreshes LND
|
||||||
|
information. Remove it and its independent LND polling; wallet interfaces remain
|
||||||
|
elsewhere. Rename Find Nodes to Connect with Nodes, including English/Spanish
|
||||||
|
translations and existing navigation assertions. Four focused component tests
|
||||||
|
pass. Full frontend tests, type checking and mobile/desktop rendering checks are
|
||||||
|
still required; no deployment or operator acceptance is claimed.
|
||||||
|
|
||||||
|
## Fleet findings to investigate
|
||||||
|
|
||||||
|
`normalizeFleetNode` substitutes zero for absent metrics, and timestamp age alone
|
||||||
|
is interpreted as online/offline. Missing values must not be presented as real
|
||||||
|
zero measurements, and stale reporting must not be treated as a measured offline
|
||||||
|
transition. Trace telemetry collection and transport before changing presentation.
|
||||||
|
|
||||||
|
## V4V source and demo catalog located
|
||||||
|
|
||||||
|
The existing Gitea repository is `v4v/v4v`, branch `demo-portainer`, at
|
||||||
|
`3ae171d6b0c728665a860520fe393c0abb772798`. The earlier `lfg2025/v4v`
|
||||||
|
location does not resolve on that server. Read-only inspection of the actual
|
||||||
|
Portainer documentation confirms a sanitized demo catalog with 52 entries and
|
||||||
|
47 playable tracks: 21 bundled demo WAVs and 26 publisher-hosted entries. These
|
||||||
|
counts describe the documented seed, not a fresh playback acceptance result.
|
||||||
|
|
||||||
|
Its importer is designed to back up existing state, merge by ID and retain
|
||||||
|
accounts, payment records and edits. Qualify those behaviors before deployment.
|
||||||
|
The source explicitly keeps private catalog/media archives out of public source
|
||||||
|
publication. Preserve that boundary when packaging the Yaya-only demo: hiding a
|
||||||
|
card is not sufficient protection for private media or credentials. Inspect the
|
||||||
|
existing node's state and exact deployed revision before modifying its stack.
|
||||||
|
|
||||||
|
## Qualification results so far
|
||||||
|
|
||||||
|
Frontend type checking passes. Full suite: 1,221 passed, one unchanged paid-file
|
||||||
|
case hit its 20-second test timeout under concurrent build/upload load. That
|
||||||
|
file's six tests all passed when rerun alone. Retain the original failure; do not
|
||||||
|
rewrite it as an entirely green full-suite run. Four targeted navigation tests
|
||||||
|
passed separately. Mobile/desktop browser acceptance remains outstanding.
|
||||||
|
|
||||||
|
The first new Rust test compile exposed two fixture-only String/&str mismatches.
|
||||||
|
Corrected them and added rejected-relay coverage: failed delivery must leave the
|
||||||
|
request Pending and must not add a peer. Isolated compilation/execution now passes (one integration test covers four
|
||||||
|
scenarios). No live peering repair or deployment is claimed.
|
||||||
|
|
||||||
|
Public relay queries found no matching reply on the managed relays that completed
|
||||||
|
the query; some endpoints were unavailable. The default Damus relay requires
|
||||||
|
authentication for this filter, so its unauthenticated rejection is not evidence
|
||||||
|
of a missing event. The installed SDK already enables automatic authentication.
|
||||||
|
Do not infer that the node has the same rejection without authenticated evidence.
|
||||||
|
|
||||||
|
### Completed source-test runs
|
||||||
|
|
||||||
|
The second full frontend run, limited to two workers, passes all1,222 tests across
|
||||||
|
150 files. Type checking passes. The first full backend run exposed a real
|
||||||
|
pre-existing bug: encrypted chat/contact nonces starting with `{` or `[` were
|
||||||
|
misclassified as legacy JSON. This is not dismissed as a flaky test.
|
||||||
|
|
||||||
|
Replace prefix-only classification with full JSON object/array validation using
|
||||||
|
`IgnoredAny` to avoid building another object tree. Deterministic valid encrypted
|
||||||
|
fixtures cover both prefixes; existing pre-migration ciphertext compatibility
|
||||||
|
and tamper/wrong-key tests remain. Full isolated backend rerun passes1,683 tests,
|
||||||
|
zero failures, four existing ignored. Logs are retained in
|
||||||
|
`/tmp/archy-followup-backend-suite-2.log` and
|
||||||
|
`/tmp/archy-followup-ui-suite-2.log`.
|
||||||
|
|
||||||
|
Published1.9.0 artifacts remain unchanged, and their release page discloses this
|
||||||
|
newly discovered issue. Private snapshots were attempted on all four authorized
|
||||||
|
nodes before further restarts: only Shorty had an affected message store at the
|
||||||
|
expected paths; its bytes were verified after backup. No message contents or
|
||||||
|
wallet data were exported. Actual candidate build/deployment and store reload
|
||||||
|
acceptance still remain; do not equate source-test success with delivery.
|
||||||
Reference in New Issue
Block a user