280 lines
14 KiB
Markdown
280 lines
14 KiB
Markdown
# AI working notes for mars-nwe
|
|
|
|
This file is the handoff and assistant-rule document. It should keep the next
|
|
chat on the current track without forcing it to reconstruct old patch history.
|
|
Keep it short enough to read before touching code.
|
|
|
|
## Start of a new chat
|
|
|
|
1. Treat `mars-nwe-master` as the root/superproject. The other `mars-*` bundles
|
|
are submodules or sibling component sources needed by the root build.
|
|
2. Read the root `*.md` files and `doc/*.md` before changing namespace, salvage,
|
|
transport or dependency code. The most important active files are
|
|
`TODO.md`, `REDESIGN.md`, `ENDPOINTS.md`, this file, and:
|
|
- `doc/NSS_NAMESPACE_AUDIT.md`
|
|
- `doc/NSS_PUBLIC_CORE_AUDIT.md`
|
|
- `doc/NWFS_SALVAGE_COMPRESSION_TOOLS.md`
|
|
- `doc/HANDOFF_AUDIT.md`
|
|
3. Do not assume an older bundle is current. Use the latest applied user state
|
|
or the latest bundle/patch explicitly accepted by the user.
|
|
4. For a fresh build in a new chat, check whether `prepare-local-deps.sh` is
|
|
present in the root and run/use it before trying to build; it stages the
|
|
uploaded offline third-party tarballs and local-only headers needed by the
|
|
current dependency layout.
|
|
5. Default language with the user is German; repository documentation remains
|
|
English unless the existing file is German.
|
|
|
|
## Documentation ownership
|
|
|
|
- `TODO.md` is the active backlog. The top implementation dashboard is allowed
|
|
and should stay. Unfinished long-running tracks stay in `TODO.md` until real
|
|
implementation/test work closes them.
|
|
- `REDESIGN.md` is the durable architecture/design record. Put stable plans,
|
|
rationale and completed design decisions there, not patch chronology.
|
|
- `AI.md` is for working rules, current handoff state, rejected patches and next
|
|
action guidance. Keep it concise; do not append duplicate historic handoff
|
|
dumps forever.
|
|
- `ENDPOINTS.md` is the decimal/hex NCP audit table.
|
|
- `doc/*.md` files are focused topic audits/roadmaps. Keep namespace, NSS
|
|
public-core and salvage/compression/tool details in their matching doc files.
|
|
|
|
When a TODO is finished, remove it from `TODO.md` in the same patch and record
|
|
its stable outcome in `REDESIGN.md` or the focused `doc/*.md` file. Do not move
|
|
unfinished work out of `TODO.md` merely because its architecture is documented.
|
|
|
|
## Current accepted patch line
|
|
|
|
Latest patch marker expected in an up-to-date bundle:
|
|
|
|
- `0453 docs: record patch-only export and author rules`
|
|
|
|
When a later chat receives a new `mars-nwe-master` bundle, compare `git log -1`
|
|
with this marker. If the uploaded bundle already contains this commit subject,
|
|
the last patch was applied. If the bundle is older and the old chat download no
|
|
longer works, recreate the missing patch instead of assuming it was applied.
|
|
|
|
The active line is expected to include:
|
|
|
|
- Quota work through the corrected Linuxquota/NWQUOTA split and DOS/live smokes.
|
|
- NSS low-level imports through the Unicode/codepage, UTC, GUID/ID, xCtype and
|
|
xString helper line.
|
|
- `0434 build: record offline dependency bootstrap layout`.
|
|
- `0435 docs: record transport config and nwfs watch plan`.
|
|
- `0436 docs: keep unfinished NSS and salvage work in TODO`.
|
|
|
|
## Current patch handoff block
|
|
|
|
Last generated patch:
|
|
|
|
- `0453 docs: record patch-only export and author rules`
|
|
|
|
Purpose of that patch:
|
|
|
|
- Record that future repository changes should export only the `git am` patch
|
|
file by default, not a bundle, and that generated patch mail headers must use
|
|
`Mario Fetka <mario.fetka@disconnected-by-peer.at>` as author identity.
|
|
Keep this block replaceable: every later patch must overwrite it with the
|
|
next commit subject and short patch purpose instead of appending history.
|
|
|
|
|
|
Rejected or superseded patches that must not be reused as-is:
|
|
|
|
- `0380`
|
|
- `0398`
|
|
- `0403`
|
|
|
|
## Current immediate direction
|
|
|
|
Before starting namespace implementation, keep the documentation boundaries
|
|
clean:
|
|
|
|
- `TODO.md`: active work only, dashboard retained.
|
|
- `REDESIGN.md`: architecture and design separation clarified.
|
|
- `AI.md`: concise current state and rules only.
|
|
|
|
Before namespace code changes, keep the legacy logging audit in mind: old MARS
|
|
accepts numeric debug thresholds from `0` to `99`, but the actual source mostly
|
|
uses `1..5`. The future `nwlog` facade should give those normal levels clear
|
|
semantic names instead of preserving the old overloaded buckets: `1=error`,
|
|
`2=warn`, `3=info`, `4=debug` and `5=trace`. `debug` is local diagnostic detail; `trace` is packet/message/handoff path following across process or provider boundaries. New config should expose the cumulative numeric masks `0`, `1`, `12`, `123`, `1234` and `12345` as synonyms for `off`, `error`, `warn`, `info`, `debug` and `trace`, and use one global `[logging] level` plus optional `[logging.process.<name>] level` overrides; the old numeric `100..106` process entries stay accepted for compatibility. Useful legacy `6..99` traces should
|
|
map to `nwlog_detail()` later. `nwlog_detail()` is not part of the normal
|
|
`1..5` threshold ladder: normal builds return `0`, while `MAINTAINER_BUILD`
|
|
builds may emit detail whenever such a call site is reached. No INI option may
|
|
enable it in a normal build.
|
|
`nwlog`/zlog remains a facade/backend plan, not a reason to call zlog directly.
|
|
See `include/nwlog.h` and `doc/LOG_LEVEL_AUDIT.md`.
|
|
|
|
Before namespace code changes, use the handoff audit rules in `doc/HANDOFF_AUDIT.md`.
|
|
New namespace/NWFS work must not add new magic `return(-1)` / `return(-2)` paths.
|
|
Use the provider names in `include/ncp_endpoint.h` for audits and future endpoint
|
|
tables, but do not wire the enum into runtime dispatch until the current
|
|
`nwconn` to `nwbind` handoff sites are annotated.
|
|
|
|
Then begin the namespace track:
|
|
|
|
1. Start with DOS namespace compatibility for NetWare 1.x/2.x/3.x clients.
|
|
2. Use the NSS namespace sources as the replacement/adaptation target, not a
|
|
permanent wrapper over old MARS `namedos`/`nameos2` code.
|
|
3. Keep `src/namspace.c` as NCP glue over the future namespace engine.
|
|
4. Move reusable filesystem/namespace/metadata helpers toward `libnwfs`.
|
|
5. Defer broad 4.x/NDS/OES runtime behaviour unless it is guarded or required
|
|
by a concrete compatibility path.
|
|
|
|
## NCP notation rule
|
|
|
|
Always write NCP groups/selectors with both decimal and wire/code hex when
|
|
recording protocol details. Examples:
|
|
|
|
- decimal 87 == wire/code `0x57`
|
|
- decimal 90/12 == wire/code `0x5a/0x0c`
|
|
- decimal 123/70 == wire/code `0x7b/0x46`
|
|
|
|
Use `ENDPOINTS.md`, the NDK Core Protocols PDF, WebSDK docs and SDK includes as
|
|
references. NetWare 3.x/default compatibility has priority over broad 4.x/NDS
|
|
work.
|
|
|
|
## Patch workflow
|
|
|
|
- Make small, reviewable patches with one clear subject.
|
|
- Inspect current sources before editing; no speculative patching.
|
|
- Run at least `git diff --check` before exporting a patch.
|
|
- Also run syntax/build/test checks that match the touched files when feasible.
|
|
- Export only the `.patch` file by default when producing repository changes.
|
|
Do not create or link a bundle unless the user explicitly asks for one.
|
|
- Every repository patch must update this `AI.md` with the new final commit
|
|
subject in the current patch marker before exporting the patch. If the user
|
|
later uploads a bundle from their repository, the marker makes that bundle
|
|
self-identifying even when old chat downloads have expired or are unavailable.
|
|
- Every repository patch must also replace the single `Current patch handoff
|
|
block` in this file with a short description of what the patch was meant to
|
|
do. Replace the old block; do not append a new one for every patch.
|
|
- Always include a copy/paste `git am <patch-name>.patch` command in the user
|
|
response next to the patch download link. This is part of the handoff
|
|
contract, not an optional nicety.
|
|
- Generate patch mail headers with `Mario Fetka <mario.fetka@disconnected-by-peer.at>`
|
|
as the author identity, not an AI/OpenAI identity.
|
|
- Do not claim a build/test passed unless it actually ran in the current work
|
|
tree.
|
|
|
|
## Source/layout rules
|
|
|
|
- Keep active NSS low-level helper imports directly under normal MARS paths such
|
|
as `src/core/<original>.c` and `include/core/<original>.h`; do not create or
|
|
keep a permanent `src/core/nss/` wrapper/reference area for helpers already
|
|
imported into normal core files.
|
|
- Preserve original NSS API names where that improves compatibility with later
|
|
imported code.
|
|
|
|
- GPL-2.0-only source imports are allowed when the imported source permits GPLv2
|
|
use and the original provenance/license headers are preserved. For Linux
|
|
kernel reference material, record that mars-nwe selects GPL-2.0-only.
|
|
- Clean NSS staging incrementally: once an NSS file has been imported, adapted or
|
|
stubbed in a normal MARS path, remove the duplicate staging/reference copy
|
|
unless an audit document names a still-open reason to keep it. Do not delete
|
|
active `src/nwfs/nss/` namespace/common/compression reference material before
|
|
the matching libnwfs adaptation is complete.
|
|
- Do not import whole NSS/OES runtime subsystems just to satisfy helper
|
|
dependencies. Replace kernel, VFS, memory-tracking and platform hooks with
|
|
small userland glue when a helper is otherwise useful.
|
|
- `libnwcore` is for base helpers: Unicode/codepages, CRC/hash/bitmap, GUID/ID,
|
|
UTC/time, allocation/string compatibility and similar low-level pieces.
|
|
- `libnwfs` is for namespace, file IDs, metadata, streams, EA, salvage,
|
|
compression, host-side reconcile and `_ADMIN` virtual-volume filesystem work.
|
|
- `libnwbind` is for bindery identity/storage; `libnwnds` is for later
|
|
eDirectory/NDS work.
|
|
|
|
## Namespace rules
|
|
|
|
- Do not expand old MARS `namedos`/`nameos2` as the long-term solution. They are
|
|
replacement targets.
|
|
- Import/adapt the NSS namespace engine directly, then retire old MARS namespace
|
|
logic after tests cover DOS/LONG behaviour.
|
|
- Stable namespace state belongs in `netware.metadata`: file ID, parent file ID,
|
|
DOS name, LONG/OS2 name, MAC name, UNIX/backend name, casefold/hash fields and
|
|
namespace flags.
|
|
- Existing Linux files created by Samba, rsync or local admin tools must be
|
|
reconciled by libnwfs watcher/scanner work, not by a private side database.
|
|
- MAC namespace is a namespace/stream/metadata problem, not a transport problem.
|
|
Resource forks and Finder info belong in streams/metadata later.
|
|
|
|
## Salvage/recycle rules
|
|
|
|
- Keep `.recycle` as the Samba-compatible deleted-payload backend.
|
|
- Make `netware.metadata` on the recycled payload authoritative for deleted
|
|
state.
|
|
- Treat `.salvage` JSON as legacy migration/debug data only; do not make it a
|
|
second long-term authority.
|
|
- Samba `vfs_recycle` normally uses rename, so xattrs remain attached to the
|
|
recycled inode. Manually copied files in `.recycle` without
|
|
`netware.metadata` are not valid NetWare salvage objects unless an explicit
|
|
admin repair tool marks them.
|
|
- If a compressed file is recycled, the `.recycle` payload should be a normal
|
|
uncompressed Linux file; keep previous compression state in `netware.metadata`.
|
|
|
|
## Compression and stream rules
|
|
|
|
- Compression belongs in `libnwfs`, not `libnwcore`.
|
|
- Future private stream/compression data belongs under
|
|
`.nwfs_streams/<stable-file-id>/...`.
|
|
- The stable file ID comes from MARS/NWFS/NSS-shaped metadata, not from Linux
|
|
inode numbers and not from visible filenames.
|
|
- Do not encode compression state in visible names such as `compressed_*`.
|
|
|
|
## Transport rules
|
|
|
|
- TCP/IP is a transport split under `nwconn`/`nwserv`, not a new daemon.
|
|
- Planned files: `src/nwtransport.c`, `src/nwipx.c`, later `src/nwtcp.c`.
|
|
- NCP providers stay transport-neutral:
|
|
`IPX/TCP -> nwtransport -> nwconn -> dispatcher -> providers`.
|
|
- Use audited libowfat API names from the bundled `mars-libowfat` source:
|
|
`socket_tcp4()`, `socket_tcp6()`, `socket_bind4_reuse()`,
|
|
`socket_bind6_reuse()`, `socket_listen()`, nonblocking accept helpers and
|
|
`io_*` readiness helpers.
|
|
- IPX config sections use frame tokens without dots:
|
|
`8022`, `8023`, `etherii`, `snap`, `tr8022`, `auto`.
|
|
- `[transport.ipx.local]` is the internal network; explicit routes use
|
|
`[transport.ipx.route.<target>]`.
|
|
- If IPX is requested but `socket(AF_IPX, ...)` fails, report that AF_IPX is
|
|
unavailable instead of silently falling back.
|
|
- A future L2 IPX backend is allowed, but it is an additional backend below
|
|
`nwtransport`, not a replacement for the kernel path. Start with Ethernet_II
|
|
IPX, SAP/RIP, and NCP socket `0x0451`.
|
|
- Do not vendor a capability library for L2 IPX. Open the packet socket and
|
|
report missing `CAP_NET_RAW`/`CAP_NET_ADMIN`; root, setcap, or systemd
|
|
capabilities are deployment policy.
|
|
- Do not copy GPL-3.0-or-later code from the Rust `nwserver` reference. Use only
|
|
the observed architecture: userland Ethernet/IPX packet handling, SAP/RIP, and
|
|
NCP socket dispatch.
|
|
- SPX, if needed, is a later userland layer above IPX. Do not rely on kernel
|
|
SPX and do not make namespace work wait for SPX.
|
|
- Linux 2.4.37.9 SPX is imported only as reference material in
|
|
`src/kernel/af_spx.c` and `include/kernel/spx.h`; do not build it as-is.
|
|
|
|
## Dependency/source bundle rules
|
|
|
|
- `mars-nwe-master` is the root repository.
|
|
- Uploaded `mars-*` bundles are submodules/sibling components needed in the
|
|
configured locations.
|
|
- Offline point-release tarballs are staged by `prepare-local-deps.sh`. In a
|
|
new chat or clean checkout, use this script as the first dependency/bootstrap
|
|
step before CMake/build attempts:
|
|
- `yyjson-0.12.0` into `third_party/yyjson`
|
|
- `zlog-1.2.18` into `third_party/zlog`
|
|
- `libsodium-1.0.20` into the nested libsodium snapshot path
|
|
- `gdbm-1.26` built locally under `.local-deps/prefix`
|
|
- PAM and ncurses headers staged while linking to system libraries
|
|
- Do not vendor random system headers directly into endpoint/provider code.
|
|
|
|
## New reference inputs available for the next namespace work
|
|
|
|
The user supplied fresh reference archives for the next phase:
|
|
|
|
- `nss-common.tar.bz2`
|
|
- `nss.tar.bz2`
|
|
- `ncp__enu.pdf`
|
|
- `websdk.tar.gz`
|
|
- `include.tar.gz`
|
|
|
|
Use these for source audits and exact NCP structure/selector verification before
|
|
implementing namespace changes.
|