# local Revit/bridge state .bridge-sessions.log # one per port: "the last request on this bridge never came back", written by # tools/rvt.py so the next call drains the channel before it trusts an answer. .bridge-timeout-*.json _ticketqc/ # build output dist/ build/ *.egg-info/ # python __pycache__/ *.pyc *.pyo .pytest_cache/ # editors / local tool settings .vscode/ .idea/ .claude/settings.local.json # scratch scratch/*.py !scratch/scratch.py # _scratch is where the agents work: probe scripts, bridge responses, run logs. # It is not the same directory as scratch/ above, and the rule there never # covered it -- 745 untracked files accumulated in it carrying client names, # job names and absolute user paths, one `git add -A` from the history. Work # that is meant to be kept gets moved OUT of here into its real home. _scratch/ # Real exported tickets, kept locally to check against. They carry the job # name and the client's name in the title block, and scrub.py cannot read a # PDF -- the gate would pass them straight through. Never commit them. sample data/ *.pdf *.log # client-name denylist, must never be committed .scrub-terms # QNA: 约定进仓库,问答内容不进 QNA/* !QNA/README.md # The knowledge folder is the OTHER repository's territory. It sits inside this # working tree for convenience during development and is tracked by KNOWLEDGE, # never by this one -- that split is the whole reason there are two repos: this # one can be shown to anybody, that one cannot. # # catalogue.yaml is the exception and is deliberately tracked here: it is the # public layer, published manufacturer data, and it says so in its own header. knowledge/plant/ knowledge/job/ knowledge/_archive/ # ...and the SYMLINK spellings: on the host machine these three are links into # the private KNOWLEDGE checkout (git matches a trailing-slash rule against # directories only, so the link itself would show up untracked -- same lesson # as knowledge/library below, 2026-09-05). knowledge/plant knowledge/job knowledge/_archive # knowledge/library/ is the PDF drop and its ledger -- manuals, manufacturer # catalogues, datasheets, plus the record of what has been mined out of each # and where every fact landed. Same territory as the three lines above and # excluded for the same reason: it is KNOWLEDGE's, never this one's. # # The PDFs themselves are already caught by `*.pdf`, and that rule exists # because scrub.py cannot read a PDF -- a title block carrying the job and the # client goes straight through the gate. The ledger and the extraction notes # beside it are worse, not better: quoting the source is their whole job, so # a name in them is certain rather than possible. The FOLDER is what is # excluded, not the extension, so a note, an index or a scratch transcript # dropped in there is covered the day it is written and not the day somebody # remembers to add a rule for it. `scrub.py --private` is what reads it. # Both spellings on purpose: with the slash git matches only a real directory, # and on this machine `knowledge/library` is a SYMLINK to the private repo's # checkout -- the link itself showed up untracked (2026-09-05) and one `git add` # would have committed a path into the owner's home directory. knowledge/library/ knowledge/library # knowledge/MC/ is a second producer's document drop, same territory as # library/ above and excluded whole-folder for the same reason: the files # carry the producer's name in their own filenames, which *.pdf alone does # not cover (there is a spreadsheet in there today). knowledge/MC/ # machine-local install choices (tools/setup_machine.py); .setup-opts.example is the tracked template .setup-opts # CPython virtualenv on the Debian dev box .venv/ .gitea-issue-handler.lock