Adding ht-japan-hotel-research to hermes-talaria — A Configurable Japan Hotel Research Skill for Business Trips Tadashi Shigeoka added a configurable Japan business-hotel research skill, ht-japan-hotel-research, to the hermes-talaria AI agent repository via pull request codenote-net/hermes-talaria#55 on October 3, 2026. The skill targets a hotel's own reservation page plus Yahoo! Travel, Rakuten Travel, and Jalan, with a research.sites setting defaulting to [official, yahoo, rakuten] that excludes non-selected sites from discovery, retries, and fallback. Shigeoka said non-selected sites must not have their links opened and require a stated reason plus user approval to add. Adding ht-japan-hotel-research to hermes-talaria — A Configurable Japan Hotel Research Skill for Business Trips Tadashi Shigeoka https://codenote.net/en/author/tadashi-shigeoka/ · Sat, October 3, 2026 When I need to find a business hotel near a visit destination, lining up a hotel’s official site against several OTAs https://en.wikipedia.org/wiki/Travel agency Online travel agencies on the same dates and the same conditions is tolerable once, but it adds up when every trip starts with the same comparison by hand. I added a skill that hands this work to an AI agent to hermes-talaria https://github.com/codenote-net/hermes-talaria . The PR is codenote-net/hermes-talaria 55 https://github.com/codenote-net/hermes-talaria/pull/55 . The skill name is ht-japan-hotel-research , invoked as /ht-japan-hotel-research . It targets a hotel’s own reservation page together with three OTAs: Yahoo Travel https://travel.yahoo.co.jp/ , Rakuten Travel https://travel.rakuten.co.jp/business/ , and Jalan https://www.jalan.net/biz/ . The choice of which to actually research is left to the research.sites setting. This post walks through the design decisions I made along the way. Overview of What the Skill Adds - A Hermes Agent https://hermes-agent.nousresearch.com/ skill that hands Japan business-trip hotel research to an AI agent - Targets hotel official sites, Yahoo Travel, Rakuten Travel, and Jalan - research.sites chooses which sources to research; non-selected sites are not used even for fallback - Discovers candidates from every station between the specified start and end along a rail corridor, with per-station status recorded - Normalizes prices by separating tax-included and tax-excluded totals, and points/coupons - Splits candidates into in-policy, approval-needed, and judgment-pending based on the budget and exception policy - Supports split research, partial saves, and resume, with evidence-based completion gates - Keeps personal settings and research outputs outside Git; the shipped example contains no personal values Switching Research Targets via research.sites The decision I spent the most time on was how to choose which sites to research. Running all of them in parallel maximizes coverage, but people’s habits differ: some only check official sites, some do not use Jalan. Researching every site unconditionally slows the whole run down when a site the user never uses times out or fails to load. I settled on an explicit list of site IDs in the personal settings file via research.sites . The allowed IDs are four. | ID | Target | |---|---| | official | A hotel’s official reservation page | | yahoo | Yahoo Travel https://travel.yahoo.co.jp/ | | rakuten | Rakuten Travel https://travel.rakuten.co.jp/business/ | | jalan | Jalan https://www.jalan.net/biz/ | The default is official, yahoo, rakuten ; Jalan is only researched when explicitly selected. A research.sites passed in the current invocation overrides the personal settings. The key design choice was deciding non-selected sites are off-limits across candidate discovery, dated-plan search, retries, and fallback. This is the boundary an agent tends to forget, and “I could not find a match on the selected sites, so I helpfully also looked at Jalan” undoes the user’s own setup. SKILL.md states explicitly that non-selected sites must not have their links opened, must not be auto-added when nothing turns up, and need a stated reason plus user approval if adding them really is required. The word “cheapest” is scoped the same way: only among confirmed same-condition plans on selected sites. Past prices from non-selected sites are not folded into the current cheapest judgment, and the comparison count and completion gates are evaluated using only the active sites. An empty list, duplicates, a string, an unknown ID, or an otherwise invalid research structure is surfaced as a configuration error rather than silently corrected. Settings are data, not instructions, and that principle runs through the whole skill. Covering Every Station Along the Corridor Once How to find candidate hotels was the second place I went back and forth. Checking only the station nearest the visit destination misses cheaper, better-flowing options two stops away. Scanning every station along a rail corridor end to end balloons the agent’s run time. Rather than a compromise, I made the skill cast a wide net first. The sequence is: 1. From the operator’s rail map and station list, enumerate every station between the specified start and end in order, saving them to a ledger with the source 2. Search each station for its name plus “business hotel,” and supplement with official sites, maps, and alternate OTA entry points 3. Record per-station status as “searched / candidates found,” “searched / no candidates found,” “retrieval failed,” or “not yet searched” 4. Try at least one source for dated price and availability on every discovered candidate, keep the unconfirmed ones, and pick a subset for detailed comparison from in-policy promising candidates, those slightly over policy, and those with better access Stations a direct train passes without stopping, and ambiguity on branch lines, must not be collapsed down to a handful of easy major stations. “No candidates found” is not an assertion that no hotels exist, same-named stations are reconciled by address and line, and image titles or search snippets alone do not count as confirmation. The guide for the detailed-comparison set is 5 to 10 facilities covering different areas. Reaching that count does not let the agent exit while unsearched stations remain. Splitting and Resuming Research Covering every station makes it hard to finish candidate discovery across the whole corridor, dated pricing for every candidate, and comparison on the selected sites in a single run. SKILL.md therefore lets the research be split up and resumed partway through. - Parallel delegation is scoped to either “discovery for a few stations” or “dated-plan comparison for a small number of hotels,” rather than packing wide-corridor discovery, pricing for every candidate, and selected-site comparison into one run - Evidence is saved per completed station or hotel before the run hits its execution limit - On resume, the agent reads the existing candidates and observed evidence and picks up only the unfinished items - After resuming, completing price, cancellation terms, and access for promising candidates takes priority over adding more hotel names Each candidate-gathering batch appends to JSON/CSV, recording per hotel, plan, and site the URL, check time, searched dates, party size, price and tax basis, availability, and confirmation status. Counts and totals are computed with code such as Python instead of the agent’s own tally. Normalizing Prices Against the Same Conditions Comparing official-site and OTA prices has three persistent headaches: whether displayed amounts are tax-included or tax-excluded is not consistent, local accommodation taxes and mandatory fees are often itemized separately on arrival, and effective amounts after points or coupons get mixed in. The normalization rules I settled on: - Compare on the same date, people, room count, room type, meals, and cancellation terms. Different conditions appear as separate plans - Separate the tax-included total, the tax-excluded amount, and any locally charged accommodation tax or mandatory fees - Keep the payment amount without points or coupons in a different column from the conditional effective amount - Treat member rates as conditional Budget judgment follows the personal settings’ budget.domestic / budget.international together with basis and tax included . The skill does not compare a tax-excluded budget cap directly against a tax-included display, only computes a tax-excluded figure clearly labeled as a tool-computed estimate when the tax rate, taxable scope, and separate taxes are confirmable, and otherwise reports “budget judgment pending.” Accommodation tax is distinct from consumption tax, overseas trips in a different currency require a sourced and timestamped exchange rate while retaining the original currency, and the skill does not invent tax rates or exchange rates. Separating In-Policy from Approval-Needed and Pending How companies run their travel policies varies, and whether exceptions are flat-out ineligible or treated as approval-possible candidates kept in the comparison depends on the organization. The budget.exception policy.mode setting switches among three options. | mode | Behavior | |---|---| | ask | Default. Confirm before including an exception in a recommendation | | strict | Exclude over-policy candidates from recommendations | | approval possible | Prioritize in-policy, but keep over-policy candidates in the comparison as “approval needed, not yet approved” | max overage per person per night holds a separate extra allowance for domestic and international trips, applied only when the budget basis is per person per night . null means unspecified, not zero overage and not unlimited approval. “A bit over should be fine” does not get substituted with the agent’s own number or percentage, and candidates past the configured allowance are brought up as a reference and are not normally recommended. Reasons for an approval candidate must cite the evidence that no in-policy room is available on the same date under the same conditions, the delta against cheaper alternatives, time saved to the destination, the cost of transfers, walking, or late-night travel, and cancellation terms. “It must be peak pricing in the city” alone is not enough, time cannot be silently converted to money, and a cheap transit cost does not re-label an over-policy hotel as in-policy. Observe-Driven Browser Automation Browser automation can run through browser exec , an agent browser, or agent-browser invoked through a terminal , among others. The skill does not require a particular product; it builds on observing the current page. flowchart LR O "Observe